allItems是一个NSMutableArray,当用户单击加号按钮时,将调用createItem方法。我尝试只为每个偶数索引添加(类BNRItem的)对象,所以我尝试为奇数索引添加一个NSNull的实例:
-(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次后的输出是这样的:
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,依此类推。我想知道为什么会是这样,我怎么才能修复它。
发布于 2012-09-04 01:56:19
您没有显示用于日志记录的代码,但是,根据结果,我认为您正在做的事情如下:
for( id obj in arr ){
NSLog(@"Index: %lu item: %@", [arr indexOfObject:obj], obj);
}indexOfObject:方法查找obj等于数组中某项的最低索引。因为[NSNull null]总是给你相同的对象(它是一个单例),当循环中的obj是NSNull时,indexOfObject:将总是在1处停止搜索。
for-in循环将始终按顺序遍历数组,因此您只需保留一个计数器来打印当前索引:
NSUInteger idx = 0;
for( id obj in arr ){
NSLog(@"Index: %lu item: %@", idx++, obj);
}或者使用“常规”for循环:
NSUInteger count = [arr count];
for( NSUInteger i = 0; i < count; i++ ){
NSLog(@"Index: %lu item: %@", i, [arr objectAtIndex:i]);
}最后,数组将自身打印出来,并将description发送给它包含的每个项(如果您只记录它的话):NSLog(@"%@", arr);。这将是有序的,所以除非您确实需要附加索引,否则我建议您这样做。
发布于 2012-09-04 02:46:52
Josh Caswell的答案是正确的,但是另一种方法可以是使用block-based enumeration,因为将为您提供当前索引和对象。
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"Index: %lu item:%@", idx, obj);
}];这段代码
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);
}];将导致:
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:
https://stackoverflow.com/questions/12252193
复制相似问题