首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMutableArray中的NSNull

NSMutableArray中的NSNull
EN

Stack Overflow用户
提问于 2012-09-04 01:49:24
回答 2查看 847关注 0票数 0

allItems是一个NSMutableArray,当用户单击加号按钮时,将调用createItem方法。我尝试只为每个偶数索引添加(类BNRItem的)对象,所以我尝试为奇数索引添加一个NSNull的实例:

代码语言:javascript
复制
-(BNRItem *)createItem {
    BNRItem *p = [[BNRItem alloc] init];
    if ([allItems count] == 0)
        [allItems addObject: p];
    else {
        [allItems addObject: [NSNull null]];
        [allItems addObject: p];
    }
    return p;
}

我点击加号按钮3次后的输出是这样的:

代码语言:javascript
复制
2012-09-03 13:20:13.876 Homepwner[718:f803] Index: 0 item: Laptop (123): Worth $60, recorded on (September)
2012-09-03 13:20:13.876 Homepwner[718:f803] Index: 1 item: <null>
2012-09-03 13:20:13.877 Homepwner[718:f803] Index: 2 item: Brush (234): Worth $14, recorded on (September)
2012-09-03 13:20:13.882 Homepwner[718:f803] Index: 1 item: <null>
2012-09-03 13:20:13.882 Homepwner[718:f803] Index: 4 item: Calculator (345): Worth $19, recorded on (September)

如果我一直单击加号按钮,<null>对象始终保持在索引1处,而不是递增到3、5,依此类推。我想知道为什么会是这样,我怎么才能修复它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-04 01:56:19

您没有显示用于日志记录的代码,但是,根据结果,我认为您正在做的事情如下:

代码语言:javascript
复制
for( id obj in arr ){
    NSLog(@"Index: %lu item: %@", [arr indexOfObject:obj], obj);
}

indexOfObject:方法查找obj等于数组中某项的最低索引。因为[NSNull null]总是给你相同的对象(它是一个单例),当循环中的objNSNull时,indexOfObject:将总是在1处停止搜索。

for-in循环将始终按顺序遍历数组,因此您只需保留一个计数器来打印当前索引:

代码语言:javascript
复制
NSUInteger idx = 0;
for( id obj in arr ){
    NSLog(@"Index: %lu item: %@", idx++, obj);
}

或者使用“常规”for循环:

代码语言:javascript
复制
NSUInteger count = [arr count];
for( NSUInteger i = 0; i < count; i++ ){
    NSLog(@"Index: %lu item: %@", i, [arr objectAtIndex:i]);
}

最后,数组将自身打印出来,并将description发送给它包含的每个项(如果您只记录它的话):NSLog(@"%@", arr);。这将是有序的,所以除非您确实需要附加索引,否则我建议您这样做。

票数 4
EN

Stack Overflow用户

发布于 2012-09-04 02:46:52

Josh Caswell的答案是正确的,但是另一种方法可以是使用block-based enumeration,因为将为您提供当前索引和对象。

代码语言:javascript
复制
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"Index: %lu item:%@", idx, obj);
}];

这段代码

代码语言:javascript
复制
NSMutableArray *mArray = [NSMutableArray array];

[mArray addObject:@(1)];
[mArray addObject:@(5)];
[mArray addObject:@(7)];
[mArray addObject:@(1)];
[mArray addObject:[NSNull null]];
[mArray addObject:@(10)];
[mArray addObject:[NSNull null]];

[mArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"%lu %@", idx, obj);
}];

将导致:

代码语言:javascript
复制
Index: 0 item:1
Index: 1 item:5
Index: 2 item:7
Index: 3 item:1
Index: 4 item:<null>
Index: 5 item:10
Index: 6 item:<null>

这种方式的好处是,您可以使用突变阻止进行安全快速的枚举,同时还可以在不进行另一次(可能有错误的)查找的情况下获得索引。

docs

对于NSArray枚举,

参数对于并发枚举很有用。如果没有这个参数,访问索引的唯一方法就是使用indexOfObject:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12252193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档