我必须时不时删除数组中的对象,当我这样做时,我会收到此错误。
收藏< CALayerArray:0xc4f3b20>在被枚举时被突变
此方法出现错误,该方法是数组的访问者:
- (NSArray *)occupantsArray
{
if (dispatch_get_current_queue() == moduleQueue)
{
return occupantsArray;
}
else
{
__block NSArray *result;
dispatch_sync(moduleQueue, ^{ //ON THIS LINE
result = [occupantsArray copy];
});
return [result autorelease];
}
}
正如你所看到的,我负责不返回原始阵列而是复制,但它仍然会崩溃。
此外,我删除数组元素的方法就是这个。
- (void)eraseJIDFromArray:(NSString*)jid{
dispatch_block_t block = ^{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i = 0;
for(NSString *jidAct in occupantsArray){
if([jidAct isEqualToString:jid]){
[occupantsArray removeObjectAtIndex:i];
}
i++;
}
[pool drain];
};
if (dispatch_get_current_queue() == moduleQueue)
block();
else
dispatch_async(moduleQueue, block);
}
阵列最多可以包含200个元素,因此可能需要一些时间来完成所有这些元素,但是我正在设置队列,不知道我还能做些什么。
有什么想法吗?
感谢。
答案 0 :(得分:4)
此代码:
for(NSString *jidAct in occupantsArray){
if([jidAct isEqualToString:jid]){
[occupantsArray removeObjectAtIndex:i];
}
i++;
}
可能会导致您的问题。枚举数组时不应删除元素。避免这种情况的方法是使用NSMutableIndexSet:
NSMutableIndexSet *indexes = [NSMutableIndexSet set]; // assuming NSInteger i;
for(NSString *jidAct in occupantsArray){
if([jidAct isEqualToString:jid]){
[indexes addIndex:i];
}
i++;
}
[occupantsArray removeObjectsAtIndexes:indexes];