之前在一个博客上面很生动形象的解释了引用计数的意思,对于IOS开发初学者来说,是非常有益的。原文是这样说的。
来说一下引用计数:
比如上班, 最早进入办公室的人需要开灯,之后进入办公室的人需要照明, 下班离开办公室的人不需要照明,最后离开办公室的人需要关灯。
这样对应的引用计数就是:第一个人进入办公室开灯,引用计数是1. 之后进入办公室需要照明 引用计数是2 。 下班一个人离开办公室 引用计数变成了1 最后一个离开了办公室,引用计数变成了0 。
童鞋们,,这个解释,应该很好理解。下面我们在补充说明一下。
其实,引用计数是对内存区域的空间管理方式,是应从内存块的视角去看的。任何对象都是指向它的指针,有多少个指针指向它,就有多少个引用计算。
如果没有任何指针指向该内存块了,很明显,该内存块就没有对象引用了,引用计算就是 0, 系统会人为该内存区域已经空闲,于是立即清理,也就是更新一下管理堆的链表中某个标示位。
在内存管理中: 自己生成的对象,自己持有。
不是自己生成的对象,自己也能持有。
不再需要自己持有的对象就是放。
不是自己持有的对象无法释放。
生成并持有对象:alloc/new/copy/mutableCopy
持有对象:retain
释放对象: release
废弃对象: dealloc
这些内存管理是在 cocoa框架 中的foundation框架类库的NSObject类担负的。
autorelease 是使对象在超出指定的生存范围时能够自动并正确地释放。
我们在释放对象的时候,不能释放不是自己持有的对象。
ex:
- //自己生成并持有对象
- id obj = [[NSObject alloc] init];
- //自己持有对象
- [obj release];
- //对象已释放
- [obj release];
- //释放之后再次释放已非自己持有的对象,应用程序崩溃。
- //崩溃情况: 再度废弃已经废弃了的对象时崩溃, 访问已经废弃的对象时崩溃
- 我们取得对象,但是自己不持有对象:
- //取得对象,但是自己并不持有对象
- id obj1 = [obj0 object];
- //释放不是自己持有的对象,应用程序崩溃
- [obj1 release];