我有两个功能:
返回一个填充在块中的数组
- (NSArray *)getArray {
NSArray *someValues = @[@0, @42, @23, @5, @8, @2013];
NSArray *filter = @[@42, @23, @5];
//replacing this NSMutableOrderedSet with a NSMutableArray
//and return just matched then, resolves the problem.
//so the exception has to do something with that set.
NSMutableOrderedSet *matched = [[NSMutableOrderedSet alloc] init];
for (id value in someValues) {
[filter enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isEqual:value])
[matched addObject:value];
}];
}
return [matched array];
}
另一个枚举第一个方法返回的数组
- (void)enumArray:(NSArray *)array {
NSEnumerator *enumerator = [array objectEnumerator];
for (id obj in enumerator) {
if ([obj isEqual:@42])
[enumerator nextObject]; // <== this line causes the error!
}
}
如果我现在做这样的事情
NSArray *array = [foo getArray];
[foo enumArray:array];
我将收到带有以下消息的 NSGenericException:
集合 <__NSOrderedSetArrayProxy: 0x123456> 在被枚举时发生了变异
到底是什么东西变异了。我不明白。从该数组返回一个副本可以解决问题,但我仍然不明白。
该错误与 NSMutableOrderedSet 有关系,如果我用数组替换该集合,则不会出现异常。
一些截图,抛出异常