我可以删除我在Objective-C for
循环中循环的项目而没有副作用吗?
例如,这样可以吗?
for (id item in items) {
if ( [item customCheck] ) {
[items removeObject:item]; // Is this ok here?
}
答案 0 :(得分:12)
不,如果在快速枚举for循环中改变数组,则会出现错误。制作数组的副本,迭代它,然后从原始数据中删除。
NSArray *itemsCopy = [items copy];
for (id item in itemsCopy) {
if ( [item customCheck] )
[items removeObject:item]; // Is this ok here
}
[itemsCopy release];
答案 1 :(得分:3)
枚举是“安全的” - 枚举器具有变异防护,因此如果您在枚举期间尝试修改集合,则会引发异常。
在Using Enumerators中给出了更改要枚举的数组的选项:复制数组并枚举,或者构建循环后使用的索引集。
答案 2 :(得分:0)
你可以这样删除:
//Create array
NSMutableArray* myArray = [[NSMutableArray alloc] init];
//Add some elements
for (int i = 0; i < 10; i++) {
[myArray addObject:[NSString stringWithFormat:@"i = %i", i]];
}
//Remove some elements =}
for (int i = (int)myArray.count - 1; i >= 0 ; i--) {
if(YES){
[myArray removeObjectAtIndex:i];
}
}