野指针又叫悬挂指针(Dangling Pointer)就是当指针指向的对象已经释放或回收后,但没有对指针做任何修改(一般来说,将它指向空指针),而是仍然指向原来已经回收的地址。如果指针指向的对象已经释放,但仍然使用,那么就会导致程序crash。
一般来说,出现EXC_BAD_ACCESS错误的原因都是悬挂指针导致的,但具体是哪个指针是悬挂指针还不确定,因为控制台并没有给出具体crash信息。
要想得到更多的crash信息,你需要启动NSZombieEnabled。具体步骤如下:
1.选中Edit Scheme,并点击:
2.Run -> Diagnostics -> Enable Zombie Objects:
3设置完之后,再次运行和点击悬挂指针,虽然会再次crash,但这次控制台打印了以下有用信息:
信息message sent to deallocated instance 0x7fe19b081760大意是向一个已释放对象发送信息,也就是已释放对象还调用某个方法。现在我们大概知道什么原因导致程序会crash,但是具体哪个对象被释放还仍然使用呢?
点击继续运行
留意上面的两个红色框,它们两个地址是一样,而且PollingWebViewController前面有个_NSZombie_修饰符,说明dataSource对象被释放还仍然使用。
找到前边带_NSZombie_的对象就是被释放还仍然使用的对象.