我不时会在将对象添加到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
方法中运行,如果有任何帮助。
答案 0 :(得分:2)
在进行其他读取或写入时,各种集合类在写入时不是线程安全的。您创建了一个并发枚举,这意味着您最终会在addObject:
上对NSMutableSet
进行多线程调用。这会导致崩溃。
将枚举更改为串行而非并发。
[set enumerateObjectsWithOptions:0 usingBlock:^(ESTBeacon *beacon, BOOL *stop) {
[collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
}];