码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 8:僵尸对象与MRC调试

时间:2014-12-29 10:25:04      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

关键字: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调试

标签:

原文地址:http://www.cnblogs.com/michaellfx/p/4191107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!