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

时间:2016-07-27 15:14:51

标签: objective-c xcode cocoa nsdictionary lldb

在尝试从NSDictionary获取对象时,我遇到了一个相当令人困惑的错误。在致电EXC_BAD_ACCESS时我收到了objectForKey。当我看到给定的物体时,一切都很好。字典存在。它包含我正在寻找的钥匙。关键也在那里。一切都很好。那么为什么objectForKey会在这个场合崩溃?我已经截取了代码和控制台的截图 - 您可以在打印输出中看到有问题的属性。关键在那里,字典包含该密钥。但它好像字典不存在或什么?百思不得其解。顺便说一下,我复制字典试图修复崩溃,我通常不这样做。

Screenshot of Xcode with crash

1 个答案:

答案 0 :(得分:1)

这里的问题是带线程的todo。正如我在评论中正确提醒的那样,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"];
            } 
        }
    }
} (