ios - 枚举对象并将其添加到 NSMutableSet 时的 exc_bad_access

标签 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 方法中运行,如果有任何帮助的话

最佳答案

在进行其他读取或写入操作时,各种集合类都不是线程安全的。您创建了一个并发枚举,这意味着您最终要对 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/

相关文章:

android - 在 android 或 ios 上实现以下内容的最佳方法

ios - 我们可以动态地本地化 iOS 应用名称吗

ios - ScrollView contentoffset 被重置

ios - 如何在 UILabel 文本上设置边缘样式

ios - 为什么 AudioFileReadPacketData 的参数 ioNumBytes 会导致崩溃?

objective-c - 没有信息的崩溃

ios - 使用 ComponentsSeparatedByString 的 Tokenizer 给出不正确的结果

iphone - ios:使 UIBarButtonItem 与 TabBar 导航交互

objective-c - GCDAsyncSocket 连接失败 - 仅当套接字变量被称为 "socket"时。怎么了?

objective-c - 调用当前 Modal ViewController 导致 “EXC_BAD_ACCESS”