枚举并向NSMutableSet添加对象时的exc_bad_access

时间:2014-05-16 18:33:02

标签: ios objective-c exc-bad-access enumeration

我不时会在将对象添加到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方法中运行,如果有任何帮助

1 个答案:

答案 0 :(得分:2)

在进行其他读取或写入时,各种集合类在写入时不是线程安全的。您创建了一个并发枚举,这意味着您最终会在addObject:上对NSMutableSet进行多线程调用。这会导致崩溃。

将枚举更改为串行而非并发。

[set enumerateObjectsWithOptions:0 usingBlock:^(ESTBeacon *beacon, BOOL *stop) {
    [collection addObject:[beacon dictionaryWithValuesForKeys:keys]];
}];