博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发 僵尸调试
阅读量:6454 次
发布时间:2019-06-23

本文共 1581 字,大约阅读时间需要 5 分钟。

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dxin.html

 

引自:

我的摘要:

1、为什么会使用NSZombieEnabled?

应用调试可能会收到类似 Thread 1: Program received signal:"EXC_BAD_ACCESS 这样的错误提示信息,这样的信息通常是内存操作错误引起,例如你对已释放的对象发送消息时就会出现,再如release 的对象再release,release 那些autorelease 的对象等

当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。 

 

2、如何设置为NSZombieEnabled模式?

Xcode4 下设置 NSZombieEnabled 的方法:

方法一:Product -> Edit Scheme-> Arguments, 然后将点击”加号”, 将 NSZombieEnabled 参数加到Environment Variables 窗口中, 后面的数值写上 ”YES”.

方法二:Xcode4 菜单 Product -> EditScheme -> Diagnostics 设置窗口中直接勾上Enable ZombieObjects 即可

Xcode 可用 cmd+shift+< 进到这个窗口。

NSZombieEnabled与EXC_BAD_ACCESS调试

 

3、有没有实例?

 

static NSMutableArray*array;  

 

- (void)viewWillAppear:(BOOL)animated{     

   [array addObject:@"Hello"];//使用释放掉的数组  

}  

-(void)viewDidLoad  

{  

   [super viewDidLoad];  

   array= [[NSMutableArray alloc]initWithCapacity:5];  

   [array release];  

   [array addObject:@"Hello"];//之所以不会crash,是在于事件周期未完,内存回收机制还没有执行,没有真正的回收掉array的对象内存。  

   NSLog(@"%@",[array objectAtIndex:0]);  

}  

上例的运行结果:在未开启NSZombieEnabled的状态下,会输出Hello,程序在调用之viewWillAppear的时候crash,开启NSZombieEnabled的情况下,不会输出Hello,在调用Hello的情况下应用即会停止运行,控制台报错:

*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x6aa0200

 

4、有什么需要注意的?

NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉因为NSZombieEnabled不会真正去释放dealloc对象的内存,一直开启后果可想而知

 

5、其它

 

CocoaDev,本人作者觉得讲Cocoa技术十分专业的网站之一,下面的链接详细讲了讲NSZombieEnable的原理。

苹果官方的Mac OS X Debugging Magic,详细讲述了最为一个高级苹果程序员应该具备的调试技巧

其实还可以在Instruments中开启NSZombie选项,这样就可以在Instruments中直接查看crash时候的callstack了:

你可能感兴趣的文章
IntelliJ IDEA 注册码
查看>>
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>
switch函数——Gevent源码分析
查看>>
Spring MVC简单原理
查看>>
DynamoDB Local for Desktop Development
查看>>
ANDROID的SENSOR相关信息
查看>>
laravel 使用QQ邮箱发送邮件
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
thymeleaf 中文乱码问题
查看>>
(转)CSS浮动(float,clear)通俗讲解
查看>>
os.walk函数
查看>>
[Unity3d]DrawCall优化手记
查看>>
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
查看>>
SQL Serever学习7——数据表2
查看>>
洛谷——P2404 自然数的拆分问题
查看>>
(转)Mac 下设置android NDK的环境
查看>>