2011-03-26 77 views
0

我以Daniel H Setinberg的「Cocoa Programming」開始我的Objective-C旅程。有一點讓我驚訝於內存管理。實際上,我發現目標C中的內存管理比C中的複雜,儘管我一段時間沒有觸及「非垃圾收集語言」,所以使用malloc及其朋友的舊時代可能在我的記憶中是理想化的:)。Objective-C自動釋放池

這讓我感到困惑的一點是:

-(void) loadURLFromTextField{ 
    NSURL *url = [NSURL URLWithString:self.address.text]; 
    NSURLRequest *request = [NSURLRequest requestWithUrl:url]; 
    [self.webView loadRequest:request]; 
} 
在二,三線

我分配的兩個對象,所以我認爲我需要在一些地方釋放他們。然而,對於該位的代碼的註釋內容指出:

「請注意,我們使用類方法 構建的 自動釋放的情況下,請求和URL我們不需要 釋放他們自己。」

有人可以幫我理解爲什麼這些實例是自動發佈的,以及如何從SDK文檔中獲取此信息。所有返回對象實例的類方法實際上都是自動釋放的,這是否是一種標準。感謝您的幫助!

+0

我沒有足夠的肯定,使其答案知道這一點,但總的來說,如果你沒有執行'alloc',那麼你就不需要擔心'release'。相反,如果你「分配」了一些你要負責的東西。 – Gareth 2011-03-26 11:35:00

回答

11

你不必釋放它們,因爲你不擁有它們(你沒有明確地分配它們,也沒有保留它們)。

自動發佈的對象放置在NSAutoreleasePool類的當前實例上,這會在下一次排空池時自動發送釋放消息,因此通常在當前運行循環結束時發送消息。

這就是所謂的便利方法,它返回自動釋放的對象。

所以,如果你不叫頁頭,或保留,你基本上沒有自己的對象,所以你不應該在乎釋放他們,因爲別人會做...

如果釋放出來,在你可能有一個段錯誤,因爲兩次釋放對象可能導致雙自由...

例如:

NSArray * myArray = [ NSArray emptyArray ]; 

自動釋放的對象,通過便捷方法。你不擁有它,所以你不必釋放它。

NSArray * myArray = [ [ NSArray emptyArray ] retain ]; 

您必須按照保留的順序釋放數組。

NSArray * myArray = [ [ NSArray alloc ] initWithArray: someArray ]; 

同樣在這裏,因爲你明確地分配了數組。

NSArray * myArray = [ [ [ NSArray alloc ] initWithArray: someArray ] autorelease ]; 

沒有必要在這裏釋放,因爲該對象已被放置在自動釋放池,並會自動收到一個釋放消息。

+2

[內存管理編程指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html)中有所說明。 – Jilouc 2011-03-26 11:39:06

+0

感謝您的明確答案 - 沒有分配或保留=>沒有發佈! – Piotr 2011-03-26 11:42:32

+0

Jilouc - 你的回答也很讚賞,雖然沒有Macmade那麼多......週末愉快! – Piotr 2011-03-26 11:43:32

3

在objective-c內存分配是關於所有權。原則上,包含單詞new,alloc,copy或mutableCopy的方法被假定返回一個你擁有並因此必須釋放的對象,所有其他方法返回你不需要釋放的自動釋放對象,但是可以通過做一個保留。

你可以閱讀更多here