基本内存管理规则
Objective-C中的内存管理,也就是引用计数。
内存管理模型是基于对象的所有权。任何对象都可能有一个或多个拥有者。只要一个对象至少就有一个所有者,它就继续存在。如果一个对象没有所有者,自动运行时系统会销毁它。为了确保分清什么时候你拥有一个对象,什么时候你没有拥有,Cocoa制定了以下政策:
1.自己生成的对象,自己持有
你创建一个对象时用到(“alloc”、“new”、“copy”,or “mutableCopy”)这些方法。
2.你可以通过 retain 来持有一个对象的所有权(非自己生成的对象,自己也能持有)
通常在这两种情景下使用 retain :(1)在实例方法或者一个init方法时,通过所有权来存储一个对象的属性值; (2) 防止一个对象失效。
3.当你不再需要它时,你必须释放你对该对象的所有权。
通过像该对象发送 release 或 autorelease 。 在 Cocoa 术语中,放弃一个对象的所有权通常称为“释放”对象。
4.你不能释放不属于你的对象
之前读到Kazuki Sakamoto 和Tomohiko Furumoto 著的那本《Objective0-C 高级编程》中读到一个很好的理解引用计数的方法,下面我就介绍下。
其实不用把引用计数想复杂了,我们以开关房间的灯为例来说明引用计数的机制。假设办公室里的照明设备只有一个。上班进入办公室的人需要照明,所以要把灯打开。而对于下班离开办公室的人来说,已经不需要照明了,所以要把灯关掉。此时,若是有很多人上下班,每个人都开灯或是关灯,那么办公室的情况又将如何呢?最早下班的人如果关了灯,那么办公室里还没走的人都将处于一片黑暗中,这样做肯定是不正确的。
那么解决这一问题的办法是使办公室在还有至少1人的情况下保持开灯状态,而在无人时保持关灯状态。
(1)最早进入办公室的人开灯。
(2)之后进入办公室的人,需要照明。
(3)下班离开办公室的人,不需要照明。
(4)最后离开办公室的人关灯(此时,已无人需要照明)。
为了判断是否还有人在办公室里,这里导入技术功能来计算“需要照明的人数”。
(1)第一个进入办公室,“需要照明的人数”加1。计数值从0变成1,因此要开灯。
(2)之后每当有人进入办公室,“需要照明的人数”就加1。如计数值从1变成2。
(3)每当有人下班离开办公室,“需要照明的人数”就减1。如计数值从2变成1。
(4)最后一个人下班离开办公室时,“需要照明的人数”减1。计数值从1变成了0。因此要关灯。
这样就能在不需要照明的时候保持关灯状态。办公室中仅有的照明设备得到了很好的管理。
在这里,开灯–生成对象
需要照明–持有对象
不需要照明–释放对象
关灯–废弃对象
这就是Objective-C的内存管理。