iOS 8:僵尸对象与MRC调试

关键字:MRC  手动引用计数  僵尸对象  NSZombieEnabled

周日在某群遇到一份求助代码,大致情况是UITableViewController初始化正常,向下划去时应用崩溃。问题定位到覆盖的initWithStyle中,对方的代码有一处赋值语句:_name = name。这句话直接使用了后台存储变量,所以没走setter方法。我看对方是MRC代码,开了NSZombieEnabled才确认问题,惭愧。附上关键代码,作个记录。

.h文件

@property (nonatomic, copy) NSArray *name;

.m文件

- (id)initWithStyle:(UITableViewStyle)style {

// ...

_name = name; // bug点

// 解决方式一

_name = [name copy];

// 解决方式二

self.name = name;

// ...

}

顺带回顾下NSZombieEnabled标志。NSZombieEnabled变量用于调试内存相关问题,跟踪对象的释放过程。MRC时代作用很大,ARC时代若留意对象的所有权,通常不会遇到与内存相关的崩溃。启用NSZombieEnabled,它会用一个僵尸实现替换默认的dealloc实现,即当引用计数为0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是,向它发送消息时,它显示一段日志并自动跳转到调试器,这样可方便找出问题的原因[1]

参考:

[1]. Rob Napier 等著, 美团移动 译. iOS编程实战. 北京, 人民邮电出版社. 262页

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。