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。僵尸在释放模式下不会自动关闭吗?NSDictionary
在key
上使用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