天天看點

【iOS7的一些總結】5、iOS中的記憶體管理

我們知道,為了更加友善地處理記憶體管理問題,将開發人員從繁瑣的記憶體的配置設定和釋放工作中解放出來而專注于産品和邏輯,iOS提供了一種有效的方法,即自動引用計數ARC。采用了ARC之後,絕大部分記憶體管理的問題就不需要我們繼續操心了。但是從另一個方面講,這個友善的工具也助長了程式員的懶惰情緒,很多新手和學生甚至連引用計數的含義都不清楚。的确,這部分内容相對比較難以了解,不過如果能深刻地領悟之後将會是未來學習和開發中的強大助推器。

1、關于對象所有權的概念:

當一個所有者(可以是任意的objective-c對象)進行以下操作時,它就對某個對象擁有了所有權:建立或複制了某個對象,以及将對象保留使用。可能涉及到的函數有:

如果某個所有者擁有某個對象的所有權,那麼該所有者有義務在适當的時刻釋放該對象:

在什麼時候需要着重考慮對象所有權?例如,某個對象(對象A)是另一個對象(對象B)的成員,而且子對象(A)與某個外部對象有關(比如通過外部對象對子對象進行設定)。此時需要着重考慮子對象建立和釋放的邏輯,防止出現提前釋放、誤釋放和未釋放等問題。

2、dealloc方法

作用:在引用計數為0的時候由系統自動調用,釋放目前對象并回收記憶體。通常重寫該函數以實作手動施放該對象中手動配置設定的成員。需要注意的是,由于子類的某些執行個體繼承自父類,是以在最後必須要調用父類的dealloc方法。

3、點文法的記憶體管理

在定義屬性property的時候通常會指定類型,如retain、assign等。主要考慮三個部分:

(1)指派特性:assign——直接指派(default);retain——保留對象,二者指向同一執行個體,引用計數+1;copy——拷貝對象,引用計數不變(少數情況下等價于retain);

(2)讀寫性:readwrite——可讀寫(default),生成setter和getter方法;readonly——隻生成getter方法;

(3)原子性:atomic——原子類(default),開啟多線程保護;nonatomic——非原子類,不存線上程保護。

定義了property後,在使用點文法進行設定和讀取成員變量的時候會自動根據定義的類型進行相應的記憶體操作。

4、自動釋放池autorelease pool

在一個自動釋放池中建立的對象,可以被自動釋放。NSObject類提供了autorelease消息,向某個對象發送autorelease就可以将該對象加入自動釋放池。在自動釋放池銷毀的時候,會自動向池中的每一個對象發送一條release消息。

需要注意的一點是,自動釋放池并不能保證每一個池中的對象都成功施放。因為如果池中的對象引用計數大于1,則由于自動釋放池僅會發送一條release消息,是以該對象依然會存在。

繼續閱讀