当对象添加到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]];
}];

10-08 06:07