1.2 什么是僵尸对象、野指针、空指针呢?
僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用。
野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)。
空指针:没有指向任何对象的指针(存储的是 nil、NULL),给空指针发送消息不会报错;空指针的一个经典使用场景就是在开发中获取服务器 API 数据时,转换野指针为空指针,避免发送消息报错。
2. 为什么需要引用计数?
从上面简单例子,我们还看不出引用计数真正的用处,因为该对象的生命周期只是在一个方法内。在真实的应用场景中,我们在方法内使用临时对象,通常不需要修改他的引用计数,只需要在方法返回前销毁对象就可以了。
然而,引用计数真正派上用场的场景是在面向对象的程序设计架构中,用于对象之间传递和共享数据。
举个例子:
假如对象 A 生成了一个对象 O,需要调用对象 B 的某个方法,将对象 O 作为参数传递过去。
在没有引用计数的情况下,一般内存管理的原则是「谁申请谁释放」,那么对象 A 就需要在对象 B 不再需要对象 O 的时候,将对象 O 销毁。但对象 B 可能临时用一下对象 O,也可以觉得他重要,将他设置为自己的一个成员变量,在这种情况下,什么时候销毁对象 O 就成了一个难题了。
对于以上情况有两种做法:
(1)对象 A 在调用完对象 B 的某个方法之后,马上销毁参数对象 O,然后对象 B 需要将对象 O 复制一份,生成另一个对象 O2,同时自己来管理对象 O2 的生命周期。但是这种做法有一个很大的问题,就是他带来更多的内存申请、复制、释放的工作。本来可以复用的对象,因为不方便管理他的生命周期,就简单地把他销毁,又重新构造一份一样的,实在太影响性能。











