野指针与僵尸对象
1.
野指针
1>C语言中的野指针:一个指针变量指向一块随机的空间,这个指针就是野指针当我们声明一个指针变量的时候,没有为这个指针变量赋值,那么这个指针变量里面的值是一个随机的垃圾值.
2>OC中的野指针:指针指向的对象已经被释放,这个指针就叫做野指针僵尸对象:一个被释放的对象,就叫做僵尸对象对象回收的本质:是对象占用的空间系统可以分配给别的对象在未被分配给别的程序之前,其实这个对象还在,数据也还在的.但是这块空间随时有可能分配给别的程序
3>僵尸对象:
3.1>内存中的释放机制:把一个对象销毁掉,并不是把那个内存空间给销毁掉而是对象占用的空间可以分配给别的对象了在未被分配给别的对象之前,数据仍然是存在
3.2>僵尸对象一个已经被释放的对象,就叫做僵尸对象
3.3>通过野指针访问的对象就是僵尸对象有可能会出错,也有可能不会出错当僵尸对象占用的空间没有分配给别的程序的时候,就不会报错4>所以,一旦一个指针成为野指针,就不要通过这个野指针去访问对象的成员了因为这个时候有很多未知
4>通过指针去访问一个对象的时候,Xcode默认情况下不会去检查这个对象是否为一个僵尸对象可以开启Xcode的僵尸对象的检查这样的话,每次通过一个指针去访问一个对象,都会去检查这个对象是否为一个僵尸对象.如果是僵尸对象.立即报错如何开启僵尸对象实时检测->run->editManager->run->
5>既然开启僵尸对象这么多好处,为什么不默认开启?一旦开启僵尸对象,每次在使用这个指针访问对象的时候,都会检查这个对象是否为一个僵尸对象.这样会非常消耗性能
如何避免使用僵尸对象在对象引用计数变为0的时候,给指针变量赋值nil
不能让一个僵尸对象复活
[p1 release];//
引用计数器为0,所以对象被释放,p1是一个野指针,对象是个僵尸对象
[p1 retain];//
这句话是不可能将僵尸对象复活的,p1是一个野指针,通过野指针访问僵尸对象会报错