经过上面的真机调试之后,发现我们的程序崩在了一个方法里,并且报错 “Thread 1:EXC_BAD_ACCESS(code=1,address=0x4000)”,这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象(Zombie Objects)来定位问题。
第一步:还是打开Xcode 选择屏幕左上角Xcode-> PReferencese,不过我们这次是要设置一下输出信息,调试的时候输出更多的信息,如下截图,勾上:
![](https://img.haomeiwen.com/i2118143/d00f8440dbd79f41.png)
第二步:再对环境变量进行设置:菜单Product > Scheme > Edit Scheme
把红色圈里面的三个选项都勾上
![](https://img.haomeiwen.com/i2118143/09b3bd740e30f66b.png)
开启该选项后,程序在运行时,如果访问了已经释放的对象,则会给出较准确的定位信息,可以帮助确定问题所在。
该功能的原理是,在对象释放(retainCount为0)时,使用一个内置的Zombie对象,替代原来被释放的对象。无论向该对象发送什么消息(函数调用),都会触发异常,抛出调试信息。
记得在问题被修复后,关闭该功能!!
第三步:设置好后调试程序,在输出界面发现了-[CFString retain]: message sent to deallocated instance错误日志
到这里,就已经很明显看出来是什么原因导致程序崩溃的了,然后再去分析代码,静下心来肯定能解决问题的了。
我这里是因为向一个空的NSString类型发送消息导致崩溃的,但是这个问题只在iOS9版本崩溃,iOS10就没问题,这个还值得深究。
网友评论