当对象添加到NSMutableSet
时,我会不时收到以下异常:
Thread 6: EXC_BAD_ACCESS (code=1, address=0x0)
它出现在以下代码块中:
- (NSSet *)project:(NSSet *)set
{
NSMutableSet *collection = [NSMutableSet set];
NSArray *keys = @[@"proximityUUID", @"major", @"minor"];
[set enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(ESTBeacon *beacon, BOOL *stop) {
[collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
}];
return [self alter:collection];
}
更精确地讲:
[collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
。我知道这是内存问题,但我不确定是什么原因。可能是选项
NSEnumerationConcurrent
导致了异常?还是什么呢?另外,我应该使用其他枚举方法吗?
注意:上面的代码在
dispatch_async
方法中运行,如果有帮助的话。 最佳答案
在进行其他读写操作时,各种收集类都不是线程安全的。您创建了一个并发枚举,这意味着您最终在addObject:
上对NSMutableSet
进行了多线程调用。这导致崩溃。
将您的枚举更改为串行而不是并发。
[set enumerateObjectsWithOptions:0 usingBlock:^(ESTBeacon *beacon, BOOL *stop) {
[collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
}];