2011-02-05 92 views
2

比較下列2個片段:這個objective-c代碼是否會導致內存泄漏?

樣品1:

[[UIApplication shareApplication] openURL: [NSURL URLWithString:@"http://stackoverflow.com"]] 

和樣品2:

NSURL *url = [[NSUrl URLWithString:@"http://stackoverflow.com"]; 
[[UIApplication shareApplication] openURL: url]; 
[url release]; 

是否樣品1原因內存泄漏? 是樣本2中的[url釋放]多餘?

如果發生內存泄漏,它有多糟?

回答

9

示例1不會導致內存泄漏,並且是執行此操作的一般方法。 NSURL對象是autoreleased,因此你不應該自己釋放它(就像你在樣本2中做的那樣)。

-2

@BoltClock,我認爲你是不完全正確地說,對象樣品自動釋放1

在樣品2中,一個名爲url變量分配對象從[NSUrl URLWithString:]方法返回,從而增加其保留數爲1.要平衡一下,我們需要release吧。在示例1中,對對象的引用直接傳遞給接收者,我們無需擔心其保留計數,因此無法釋放。

請注意,我們不是自動回收,因爲我們沒有保留任何東西。 「正在自動發佈的代碼中沒有變量!」

如果我在某個地方的概念錯誤,請糾正我。只是爲了完成這一點,任何一個樣品都沒有泄漏,而且兩者都是正確的做法。

+1

我很抱歉,但這是錯誤的。除非使用以「alloc」或「new」開頭的方法或包含「copy」的方法創建對象,否則不應釋放對象。 URLWithString:返回一個自動發佈的NSURL,它將在runloop結束時自動釋放。 [內存管理編程指南](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html) – 2011-02-05 17:51:51

2

樣品1非常好,如上所述。但是,樣本2實際上應該導致崩潰。 -URLWithString:是自動釋放的,因此當下一個自動釋放池耗盡時,其保留計數實際上已經爲零。明確地釋放它,就像你正在做的那樣,會立即使其保留計數爲0,從而導致釋放。然後,當自動釋放池被耗盡時,它會嘗試再次釋放該字符串,導致崩潰。

最好在Xcode中使用Build and Analyze命令。它可以提取並警告你幾乎所有的內存泄漏問題,儘管它並不完美。不過,這是一個好習慣。

相關問題