2011-03-12 38 views
1

我與一個朋友爭論誰說,我已經把這裏autorelase:可可內存管理的問題

NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease]; 

但不是當它從NSURL類的方法發送給我自動自動釋放對象?謝謝。

+1

讓你的朋友把20美元的地方放在嘴裏。然後按照他的方式編碼並觀看它的崩潰。使用Build&Analyze命令並保存賬單。 – Caleb 2011-03-12 21:02:54

回答

4

你說得對。你沒有不是分配或複製一個對象,所以你做不是必須釋放它。只需使用你的代碼而不需要autorelease。 ;-)

類方法你用過這個樣子的:(通常它我們可以不知道,因爲蘋果並沒有共享代碼。)

+(id)URLWithString:(NSString *)aString { 
    return [[[self alloc] initWithString:aString] autorelease]; 
} 
+0

+1爲了更加明確,你**不能**在這裏調用'autorelease'。它不是可選的;這是不允許的。上面的代碼幾乎肯定會崩潰。 – 2011-03-12 18:53:19

5

這是規則:

如果調用返回的對象和方法:

  • 開始new
  • 開始與alloc
  • retain
  • 包含copy

那麼你是負責釋放(或自動釋放)返回的對象。 只有這種情況並非如此,如果文檔另有說明。您也可以在頭文件中看到該方法用NS_RETURNS_RETAINED宏註釋。 (頭文件計爲文檔)

一個簡單的方法來記住這是「NARC」(新分配保留複製)。

在你的榜樣,因爲URLWithString:newalloc開始,不含copy,而不是retain,那麼你不得釋放返回的對象。這樣做違反了內存管理準則,並會導致你的應用程序崩潰(除非你在其他地方做了一些愚蠢的事情)。