iOS干货

内存管理

基本内存管理规则

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的内存管理。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注