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