当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题.
内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内存,耗费内存资源直至程序结束.
野指针则是指:当一个指针指向一个对象时,此对象已经被系统回收.然后当再次通过该指针去操作对象时,则会出现野指针错误.而当系统回收该对象时,并不会立即销毁,而此时,该对象则成为僵尸对象.
在开发过程中,有人可能发现,有时僵尸对象也能访问.这是为什么呢?主要原因是因为XCode为了提高编码效率,并不会实时监测僵尸对象.所以也就意味着它依然留在内存,所以造成"对象被销毁后依然可以通过指针进行访问"的假象.
那么,怎样解决这个问题呢?很简单,只需要在XCode中设置实时监测僵尸对象就可以了具体步骤如下:
edit scheme --- Diagnostics --- 勾选Enable Zombie objects 即可.
但这样会比较耗性能,导致编译时间延长.
接下来,简单介绍下僵尸对象的销毁过程:
假如一个对象person,其retainCount值为1,此时执行[person release],则会有如下过程
1,判断retainCount - 1 == 0 (注意,此时对象依然存在,并未成为僵尸对象,而retainCount也未被真正减一)
2,进入该类dealloc方法
3,在dealloc方法中如果调用了[super dealloc],则此时对象retainCount == 0,该对象也成为僵尸对象.
4,注意,如果没有调用[super dealloc]方法,那么该对象不会成为僵尸对象,其retainCount也不会减一.也就等于[person release]没有效果.
僵尸对象细节:1,向其发送消息,会出现野指针错误
2,如果在其类内部,可以通过成员变量名(地址)继续访问其成员属性,修改其值
OC内存管理--zombie对象,布布扣,bubuko.com
原文:http://www.cnblogs.com/dashunzi/p/3732912.html