2016笔记——Zombie

之所以用英文名称作为标题呢,是为了烘托氛围,嗯,其实这篇文章讲的就是一个调试模式——僵尸模式。先别害怕,没什么恐怖的事情发生。。

下面就具体讲一讲什么是僵尸模式,他又有什么功能:

当我们在做开发时,经常会遇到EXC_BAD_ACCESS导致错误Crash,像这种错误,Xcode不会给我们太多的提示信息来定位错误来源,此时我们就要自己想办法了。

在ARC环境下,虽然不能调用Release了,但是,仍然会出现内存泄漏。调用已经释放了的对象,会出现EXC_BAD_ACCESS错误,如果代码比较多的话,就难以寻根问源了。

我自己做了一个测试的小Demo,具体如下:

2016笔记——Zombie_第1张图片
屏幕快照 2016-02-19 09.49.30.png

简单说一下测试环境:整体是一个导航控制器,点击时,跳转到SecondViewController,这个SecondViewController是一个空的VC,不用纠结。

请仔细看一下第13行,array我使用的是assign修饰词。

运行的效果:

上来会打印:

屏幕快照 2016-02-19 09.51.58.png

然后点击屏幕任意位置,跳转第二个VC,点击返回按钮:

此时我们期望的事再次打印东西,但结果却不是了。。直接崩溃,报错是报在main文件里:

2016笔记——Zombie_第2张图片
屏幕快照 2016-02-19 09.57.17.png

打印台中出现一大堆的崩溃东西,类似于这些玩意:

2016笔记——Zombie_第3张图片
屏幕快照 2016-02-19 10.05.44.png

此时该怎么办?

在Xcode中找到如下选项:

2016笔记——Zombie_第4张图片
屏幕快照 2016-02-19 10.00.25.png

然后会出现如下界面:

2016笔记——Zombie_第5张图片
屏幕快照 2016-02-19 10.01.26.png

将Enable Zombie Objects选项勾选上即可进入僵尸模式。

此外,进入僵尸模式的最简洁的方式是Xcode下:shift+command+ < ,博大精深的快捷键~~

此时,重新运行项目,然后看一下效果,此时并不是直接崩溃在main文件中了,而是停留在这样的界面上:

2016笔记——Zombie_第6张图片
屏幕快照 2016-02-19 10.08.49.png

点击红色的圈圈里的按钮,然后就会跳转到这个界面:

2016笔记——Zombie_第7张图片
屏幕快照 2016-02-19 10.09.04.png

是不是定位到了?错误的位置以及信息我们都获取到了,然后我们把assign改为strong试试:

分分钟搞定~~很好很强大。

屏幕快照 2016-02-19 10.18.18.png

分析:

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

最后:

NSZombieEnabled只能在调试的时候使用,千万不要忘了在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存,一直开启后果不敢想像。。
加油~

你可能感兴趣的:(2016笔记——Zombie)