我與一個朋友爭論誰說,我已經把這裏autorelase:可可內存管理的問題
NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease];
但不是當它從NSURL類的方法發送給我自動自動釋放對象?謝謝。
我與一個朋友爭論誰說,我已經把這裏autorelase:可可內存管理的問題
NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease];
但不是當它從NSURL類的方法發送給我自動自動釋放對象?謝謝。
你說得對。你沒有不是分配或複製一個對象,所以你做不是必須釋放它。只需使用你的代碼而不需要autorelease。 ;-)
類方法你用過這個樣子的:(通常它我們可以不知道,因爲蘋果並沒有共享代碼。)
+(id)URLWithString:(NSString *)aString {
return [[[self alloc] initWithString:aString] autorelease];
}
+1爲了更加明確,你**不能**在這裏調用'autorelease'。它不是可選的;這是不允許的。上面的代碼幾乎肯定會崩潰。 – 2011-03-12 18:53:19
這是規則:
如果調用返回的對象和方法:
new
alloc
retain
copy
那麼你是負責釋放(或自動釋放)返回的對象。 只有這種情況並非如此,如果文檔另有說明。您也可以在頭文件中看到該方法用NS_RETURNS_RETAINED
宏註釋。 (頭文件計爲文檔)
一個簡單的方法來記住這是「NARC」(新分配保留複製)。
在你的榜樣,因爲URLWithString:
不new
或alloc
開始,不含copy
,而不是retain
,那麼你不得釋放返回的對象。這樣做違反了內存管理準則,並會導致你的應用程序崩潰(除非你在其他地方做了一些愚蠢的事情)。
讓你的朋友把20美元的地方放在嘴裏。然後按照他的方式編碼並觀看它的崩潰。使用Build&Analyze命令並保存賬單。 – Caleb 2011-03-12 21:02:54