2016-07-27 102 views
0

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

Screenshot of Xcode with crash

+0

'self.downloadProgress'属性是'NSDictionary',好的。什么是财产所有权属性?我想这不是“复制”,对吧? –

+1

仔细观察日志 - 你有一个'__NSDictionaryM' - 这是'mutable'实例。相当意外的权利?因此,检查它变得可变并修复它。 –

+0

要修复它只是像这样添加'copy'属性:'@property(nonatomic,copy)NSDictionary * downloadProgress;'希望它会有所帮助。 –

回答

0

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