Fork me on GitHub

4/17/2010

[objC] 記憶體管理

今天看了一些記憶體管理的章節,目前仍然有些許疑惑,不過將目前為止的理解記錄一下。

ObjC 當中的物件均以指標形式創建傳遞,每一個物件都會有一個 reference count,當物件被配置記憶體、被創建、或被複製時,其 reference count 都會初始為 1,任何對於這個物件施行操作的方法,都必須控制好這個 reference count,操作 reference count 可以透過每個繼承 NSObject 物件的 instant method: retain(+1) 和 release(-1)。

當 reference count 變成 0 的時候代表此物件已經不再被任何程式需要,因此就會被消滅,因此當該物件被多個擁有者使用的時候,必須小心的操作其 reference count,避免還有人要使用該物件時,其 reference count 已經變設成 0!

對類別當中的成員物件進行 存取子 (accessor) 操作時,需遵循: 1. 先將傳入物件 retain(+1) 2. 再 release 成員物件 3. 將傳入物件指向成員物件。

一般的情形下:你 New 了一個 A 類別的物件 a,B 類別的物件 b 為其成員變數 (b 的 ref count =1),現在你要透過 setter 方法從外部傳入一個物件 b' 去設定 b 的值,首先你 new 了一個 b' 物件 (b' 的 ref count =1),傳入 setter 後 b' retain (b' 的 ref count =2),接著 release b (b 的 ref count =0, 被摧毀),然後將 b' 指向 b,此時 b 和 b' 指向相同物件。

將 b' 物件傳入後,需要將 b' release 掉,因此 (b' 和 b 的 ref count = 1),當物件 a 使用完畢後則要再 release b,因此 (b' 和 b 的 ref count = 0, 被摧毀)。

如果先 release 再 retain 的話遇到傳入 b' 和 b 原本就指向相同物件的情形,將導致成員物件先被解構,而無法賦值...

.......

4/16/2010

[Programming] 小心在 for 迴圈當中的 if

如果要有條件的去loop一個迴圈,那麼不要自以為聰明的先算好會有多少個index會進去那個迴圈,如果進去該迴圈的總數是重要的,那麼就放一個counter去數!

...