【发布时间】:2016-03-03 22:05:23
【问题描述】:
【问题讨论】:
-
你确定在断点停止后它没有在for循环上运行吗?
标签: ios objective-c nsmutablearray init
【问题讨论】:
标签: ios objective-c nsmutablearray init
您正在从正在迭代的数组中删除对象。 这是一种不好的做法,可能会导致这样的错误。
你只需要替换
for (NSString *code in list)
与:
for (NSString *code in codeList)
【讨论】:
list 替换为 codeList。
不要在迭代时从数组或字典或任何集合集中删除对象。
保留迭代时要删除的索引,然后删除所有对象。您可以使用indexesOfObjectsPassingTest 方法:
NSMutableArray * list = [NSMutableArray arrayWithArray:codeList];
NSIndexSet * indexesToRemove = [list indexesOfObjectsPassingTest:^BOOL(NSString *code, NSUInteger idx, BOOL *stop) {
return [self.codeMapping.allKeys containsObject:code];
}];
[list removeObjectsAtIndexes:indexesToRemove];
【讨论】:
您应该使用indexesOfObjectsPassingTest 和objectsAtIndexes 来执行此操作:即使您遵循例如Anbu 的回复以使您的代码正常工作,此代码也会在O (n^2) 中运行。使用包含 100,000 个对象的列表来执行此操作,其中每隔一个对象就会被删除,您的应用程序会因为 CPU 时间耗尽而死去。
【讨论】:
在你看只需输入codeList,你的问题就会得到解决。
检查一下我修改了你的方法。
-(NSArray *) checkVisibleCode:(NSArray *) codeList{
NSMutableArray *list = [NSMutableArray arrayWithArray:codeList];
for (NSString *code in codeList) {
if (![self.codeMapping.allKeys containsObject:code]) {
[list removeObject:code];
}
}
return list;
}
【讨论】: