第四章 內存管理

第四章 內存管理

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init ]; [pool drain];

事實上程序中可以有多個自動釋放池。自動釋放池其實并不包含實際的對象本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池發送一條autorelease 消息,可以將一個對象添加到其中。

引用計數:

概念:創建對象時,將它的引用次數設置為1,每一次必須保持該對象時,就發送一條retain 消息, 使其引用次數加 1。

[myFraction retain];

不再需要對象時,可以通過發送 release 消息,使對象的引用次數減 1。 [myFraction release];

當引用計數為 0 的時候,系統就會釋放它的內存,通過向對象發送dealloc 消息。通過向對象發送 retainCount 消息可以獲得這個對象的引用計數, 返回的是NSUInteger 整數。 只要對象的引用計數不為0, 系統就不會釋放對象使用的內存。

將對象添加到任何類型的集合中都會使該對象的引用計數增加。從任何集合中刪除對象都能夠使其引 用計數減少。

內存中常量字符串沒有引用計數機制,因為永遠不能釋放這些對象。這也適用于使用常量字符串初始 化的不可變字符串對象。

當某段代碼需要訪問一個對象的時候, 將對象的引用計數器加1, 當其為0 表明不再有代碼訪問該對象 了,即對象將被銷毀(通過調用dealloc 方法) 。

一個簡單的示例:

int main (int argc, const char * argv[]) {

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];

RetainTracker *tracker;
tracker = [RetainTracker new]; // count: 1

[tracker retain]; // count: 2
[tracker autorelease]; // count: still 2 [tracker release]; // count: 1

NSLog (@"releasing pool");
[pool release];
// gets nuked, sends release to tracker return (0);

}

當使用 alloc、new 或者通過 copy 消息(生成接受對象的一個副本)創建一個對象,對象的引用計數 器被設置成 1。發送 retain 消息將增加引用計數器,release 消息減 1。

要獲得引用計數器的當前值,可以發送retainCount 消息 - (id) retain ;
- (void) release ;
- (unsinged) retainCount ;

訪問方法中的保留和釋放: 最好的方法設置的原則是(保持新的釋放舊的,誰擁有對象誰就復制釋放對象)

- (void ) setEngine : (Engine *) newEngine {

[newEngine retain] ; [engine release] ; engine = newEngine;

}

內存管理規則

獲得途徑

臨時對象

擁有對象

alloc/new/copy

不再使用時釋放對象

在 dealloc 方法中釋放對象

任何其他方法

不需要執行任何操作

獲得對象時保留,在 dealloc 方法中釋放對象

內存管理規則摘要: 1、釋放對象,可以釋放其所占的內存,規則是:不再使用創建或者保持的對象時,就釋放它們。 2、發送一條 release 消息不一定銷毀對象,只有引用計數變為0 時,才銷毀這個對象。系統向

對象發送一條 dealloc 消息來釋放它所占的內存。 3、自動釋放池在釋放池本身的時候自動釋放池中的對象。系統向每個對象發送一條release 消

息,對引用計數變為 0 的對象發送一條 dealloc 消息來釋放它所占的內存。 4、若你的方法中不再需要一個對象時,但需要返回它,可發送一條autorelease 消息來加入自

動釋放池。
5、若使用 alloc 或 copy 方法(或使用 allocWithZone:、copyWithZone:或 mutableCopy 方法

來直接創建對象,則由你負責釋放它。每次retain 對象時,應該 release 或 autoreleas 它。 6、除了上以規則中提到的方法之外,不必費心地釋放其他方法返回的對象,這不是你的責任。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容