首页 > 代码库 > iOS 8:僵尸对象与MRC调试
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页
iOS 8:僵尸对象与MRC调试
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。