当对象被添加到 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
方法中运行,如果有任何帮助的话。
最佳答案
在进行其他读取或写入操作时,各种集合类都不是线程安全的。您创建了一个并发枚举,这意味着您最终要对 NSMutableSet
上的 addObject:
进行多线程调用。这会导致崩溃。
将您的枚举更改为串行而不是并发。
[set enumerateObjectsWithOptions:0 usingBlock:^(ESTBeacon *beacon, BOOL *stop) {
[collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
}];
关于ios - 枚举对象并将其添加到 NSMutableSet 时的 exc_bad_access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23702365/