NSDictionaryM setObject:forKey: EXC_BAD_ACCESS 崩溃

Posted

技术标签:

【中文标题】NSDictionaryM setObject:forKey: EXC_BAD_ACCESS 崩溃【英文标题】:NSDictionaryM setObject:forKey: EXC_BAD_ACCESS crash 【发布时间】:2014-03-26 07:06:19 【问题描述】:

崩溃日志:

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x12121212

libobjc.A.dylib - objc_msgSend - isEqual:
CoreFoundation  - -[__NSDictionaryM setObject:forKey:]

代码:

if (object) 
    [_objects setObject:object forKey:key];

当 _objects 的初始化发生在代码的前面时:

- (id)init 
     self = [super init];
     if (self) 
         _objects = [[NSMutableDictionary alloc] init];
     
     return self;

对象可以是 nil 值,这就是为什么我要检查它是否存在:

AFHTTPRequestOperation *object = [[AFHTTPRequestOperation alloc] initWithRequest:request];

我不确定究竟是什么原因造成的。崩溃很少发生,我无法重现它,但是一些用户得到了它。我假设有些东西被释放了,难道_objects 是零?还是整个控制器都被释放了?为什么我可以在日志中看到isEqual

这可以解决问题吗?

if (object && _objects) 
    [_objects setObject:object forKey:key];

【问题讨论】:

你能发布更多代码吗?字典和对象的初始化? 对于对象释放无法在您的 xcode 中的僵尸对象了解更多详细信息。 ***.com/questions/20109022/… @Vive: 你确定你的密钥不会是 nil 吗? @Sunnyshah 是的,我正在使用 ARC。僵尸在释放模式下不会自动关闭吗? NSDictionarykey 上使用isEqual。你的key 是什么? isEqual 方法有什么作用?崩溃的罕见性可能是因为必须发生哈希冲突才能调用 isEqual 方法。 【参考方案1】:

您已检查字典和对象值的非空条件。尝试检查对象键的 nil 条件。可能存在 key 可以为 nil 的情况。

if (object && _objects && key) 
    [_objects setObject:object forKey:key];

【讨论】:

以上是关于NSDictionaryM setObject:forKey: EXC_BAD_ACCESS 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

-[__NSDictionaryM objectAtIndex:]:无法识别的选择器发送到实例

NSDictionaryM setObject:forKey: EXC_BAD_ACCESS 崩溃

主线程 -[__NSDictionaryM objectForKey:] SEGV_ACCERR 类型的crash

主线程 -[__NSDictionaryM objectForKey:] SEGV_ACCERR 类型的crash

-[__NSDictionaryM intValue]:无法识别的选择器发送到实例 0x13f26a60

无法将'__NSDictionaryM'(0x1111152b0)类型的值转换为'FIRDataSnapshot'Firebase Swift 3