开启Xcode对僵尸对象检测调试
BAD_ACCESS 在什么状况下出现
BAD_ACCESS 报错属于内存访问错误,会致使程序崩溃,错误的缘由是访问了野指针(悬挂指针)。野指针指的是原本指针指向的对象已经释放了,但指向该对象的指针没有置 nil,指针指向随机的未知的内存,程序还觉得该指针指向那个对象,致使存在一些潜在的危险访问操做,这些危险访问操做没法被指针指向的未知内存所处理,就会致使BAD_ACCESS错误形成程序崩溃。访问的含义包括多种状况,例如:向野指针发送消息,读写野指针原本指向的对象的成员变量等等。图片
如何调试BAD_ACCESS错误
首先调试BAD_ACCESS错误是比较困难的,咱们知道BAD_ACCESS错误是因为访问了野指针,但程序不会在野指针出现时或者在咱们访问野指针的代码处报错,致使对其难以察觉,调试方法思路以下:内存
-
开启僵尸对象诊断
首先是开启僵尸对象诊断模式,利用僵尸对象来对野指针的出现位置提供线索。咱们知道僵尸对象指的是引用计数为0被系统回收的对象,但这些对象暂时还存在于内存中,且理论上仍是可使用的,可是不稳定。开启僵尸对象诊断后,僵尸对象会暂时保持活跃用于调试,咱们的野指针在对象回收后依然指向该僵尸对象,在访问野指针也就是访问僵尸对象的状况下能够被编辑器检测出来。这个时候仍是会报BAD_ACCESS错误,可是后台会打印出该线索,例以下面的访问野指针打印的后台信息:
能够看出Xcode告诉咱们消息发送给了一个僵尸对象,僵尸对象本来是一个实例,但如今该对象被回收了而开发者还试图访问它,由此能够很容易定位问题所在。
另外开启僵尸对象诊断的方法为:打开Xcode顶部导航栏的Product-Scheme-Edit Scheme,在弹出的界面中选中左侧的Run模式,而后勾选右侧Dianostics下的Zombie Objects。
为何不默认开启僵尸对象检测呢?
由于一旦开启,每次经过指针访问对象的时候,都会去检查指针指向的对象是否为僵尸对象。因此会影响程序的执行效率,建议关闭。
-
Analyze分析
僵尸对象诊断能够帮助快速定位多数状况下的野指针问题,但也有时候不能奏效,这个时候只能利用Xcode的Analyze静态分析帮助检查可能出问题的地方,仔细检查问题所在,比较费时。
使用方法很简单,选中Xcode顶部导航栏Product-Analyze或使用快捷键Command+Shift+B,分析须要花一些时间,而后左侧会列出编辑器发现的存在潜在问题的地方,选中蓝色图标对应的问题项会跳到问题项所在的代码行。但这只能给出一些潜在提示,帮助搜索问题所在,不必定和咱们的bug相关。
定位到问题后把野指针至nil