什么是引用计数
引用计数是一个简单而有效的管理对象生命周期的方式
原理
当我们创建一个新对象时,它的引用计数为1,当有一个新的指针指向这个对象时,引用计数+1,当指针不在指向这个对象时,我们将其引用计数-1,当对象的引用计数变为0时,说明这个对象不再被任何指针指向了,这个时候我们就可以将这个对象销毁,回收内存。
为什么需要引用计数
引用计数真正派上用场的场景是在面向对象的程序设计架构中,用于对象直接传递和共享数据。
不要向已经释放的对象发送消息
例:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"Reference count = %u", [obj retainCount]);
[obj release];
NSLog(@"Reference count = %u", [obj retainCount]);
可能结果
Reference count = 1
Reference count = 1
我们注意到最后的打印结果不为0,为什么?
这是因为该对象的内存已经被回收,而我们向一个已经被回收的对象发送retainCount消息,所以它的结果是不确定的,如果该对象所占内存被复用,则可能出现程序崩溃。
那么为什么这个被回收的对象引用值为1而不是0?
因为最后一次执行Release操作的时候,系统知道马上要回收内存了,没必要再将retainCount减1了,因为不管减不减1,该对象肯定都会被回收,而对象被回收后,它的所有内存区域,包括retainCount值也变得没有意义,不将retainCount减1变成0,减少了内存操作,加速对象的释放。
网友评论