【问题标题】:EXC_BAD_ACCESS while doing NSDictionary objectForKey - but the object is there执行 NSDictionary objectForKey 时的 EXC_BAD_ACCESS - 但对象在那里
【发布时间】:2016-12-01 16:54:31
【问题描述】:

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

【问题讨论】:

  • self.downloadProgress 属性是NSDictionary,好的。什么是财产所有权属性?估计不是copy吧?
  • 仔细查看日志 - 你有一个 __NSDictionaryM - 这是 mutable 实例。很意外吧?所以检查它在哪里变得可变并修复它。
  • 要修复它,只需添加 copy 属性,如下所示:@property (nonatomic, copy) NSDictionary *downloadProgress; 希望它会有所帮助。
  • 可能值得找出导致段错误的确切原因。尝试在某些东西上使用p 命令(而不是po)并找出哪个东西打印出与错误消息中显示的相同的地址。
  • 另外,您是否使用自动引用计数?如果不是,您应该这样做。

标签: objective-c xcode cocoa nsdictionary lldb


【解决方案1】:

这里的问题与线程有关。正如我在 cmets 中正确提醒的那样,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"];
            } 
        }
    }
} (

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多