網頁

2013年2月25日 星期一

IOS 下 app 的記憶體管理: 大方向

[iphone app 開發]

大觀念:
IOS 下的 Objective-c 沒有garbage collector, 而是用比較像linux 的 reference counting, 它會
看這個物件有多少人reference 它,而在這個reference count 變為0 的時候才釋放它。

另外一種想法是,物件被一個或一個以上的人擁有,就能繼續存在,直到沒有人在擁有這個物件,它的retain count = 0 時,就會被釋放且清理。

簡單說,這樣就會釋放掉當初宣告內容特性所用過的記憶體。




此外.... 有兩種釋放的方式

一般release: 馬上釋放
當你想要讓某個物件存在時,可以傳送保留訊息 (retain message) 而擁有它,
反之,藉由 release message 傳送給物件以便放棄所有權。如果沒有其他人擁有這個物件,它將會被清理掉。

autorelease :
有的時候,剛好你放棄了這個物件,可是,其實你並不想在那一瞬間清理掉它,也許想多放一下,等其他人來再次擁有那個物件,這時候,利用自動釋放池來延長被釋放前的時間。利用autorelease message 來將它特別放到自動釋放池,而不是一般的釋放指令。

ex: [aString autorelease];




簡單的RULE:

RULE 1. 你擁有你使用 "alloc","new","copy" 和 "mutableCopy"  所建立的物件。
    a. 它的retain count =1
    b.用完時,你將負責釋放它
          b.1一般釋放
          b.2假如想要讓系統之來釋放的話,放進autorelease pool.


RULE 2.除非你取得所有權,否則一切都會在迴圈結束時消失。
意思是說,有個物件不論你有什麼方式取得(陣列,或是初始化器等),你仍然只能把它當作
它的retain count =1, 雖然你取得它了,但是你尚未擁有它,換言之,它在你做完事情時,將會被自動釋放,所以如果你想要抓住它,記得擁有它,利用retain message,並且在你使用完之後,釋放它。














沒有留言:

張貼留言