EXC_BAD_ACCESS 在执行 NSDictionary objectForKey 时 - 但对象在那里

EXC_BAD_ACCESS while doing NSDictionary objectForKey - but the object is there

我在尝试从 NSDictionary 中获取对象时遇到了一个相当令人费解的错误。我在调用 objectForKey 时得到一个 EXC_BAD_ACCESS。当我查看给定的对象时,一切都很好。词典存在。它包含我正在寻找的密钥。钥匙也在那里。一切都很好。那么为什么 objectForKey 在这种情况下会崩溃呢?我截取了代码和控制台的屏幕截图 - 您可以在打印输出中看到有问题的属性。钥匙就在那里,字典包含那个钥匙。但是好像字典不存在之类的?莫名其妙。顺便说一句,我“复制”了字典以尝试修复崩溃,我通常不会那样做。

这里的问题与线程有关。正如我在评论中正确提醒的那样,NSMutableDictionary 不是线程安全的。它在后台线程上更新,上面的代码在主线程上调用。最简单的解决方案是将这些调用包装在@synchronised 中。感谢所有提供帮助的人。

if ([update uniqueId]) {
    @synchronized (self.downloadProgress) {
        if ([self.downloadProgress objectForKey:[update uniqueId]]) {
            NSDictionary *progressInfo = [[self.downloadProgress objectForKey:[update uniqueId]] copy];
            if ([progressInfo objectForKey:@"progressString"]) {
                return [progressInfo objectForKey:@"progressString"];
            } 
        }
    }
} (