簡體   English   中英

這個objective-c代碼會導致內存泄漏嗎?

[英]Does this objective-c code cause memory leak?

比較以下2個片段:

樣本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 release]是多余的?

如果確實發生了內存泄漏,那有多糟糕?

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

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

最好在Xcode中使用Build and Analyze命令。 它可以接收並警告你幾乎所有的內存泄漏問題,雖然它並不完美。 不過,這是一個很好的做法。

@BoltClock,我認為在樣本1中對象是自動釋放的並不完全正確。

在示例2中,名為url的變量被賦予從[NSUrl URLWithString:]方法返回的對象,從而將其保留計數增加1.為了平衡它,我們需要release它。 在樣本1中,對對象的引用直接傳遞給接收者,我們沒有什么可擔心它的保留計數,因此沒有釋放。

請注意,我們不是自動釋放,因為我們首先沒有保留任何內容。 “代碼中沒有自動釋放的變量!”

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM