NSMutableArray:使用数组初始化时数据丢失
NSMutableArray: data missing when init with an Array
如截图所示,有大神知道是什么问题吗?感谢您的热心帮助!
您正在从正在迭代的数组中删除对象。
这是一种不好的做法,会导致这样的错误。
您只需更换
for (NSString *code in list)
与 :
for (NSString *code in 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;
}
如截图所示,有大神知道是什么问题吗?感谢您的热心帮助!
您正在从正在迭代的数组中删除对象。 这是一种不好的做法,会导致这样的错误。
您只需更换
for (NSString *code in list)
与 :
for (NSString *code in 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;
}