2011-12-22 120 views
1

當使用Xcode分析我得到一個消息說:潛在的內存泄漏

對象的潛在泄漏分配

的代碼,這是在我的NSData(String)類,代碼:

- (NSString*) utf8String 
{ 
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; 
} 

現在我該如何解決這個問題?當我改變了聲明:在這裏我呼籲utf8String

- (NSString*) utf8String 
{ 
    return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease]; 
} 

我的應用程序崩潰。

回答

2

我想你的應用程序崩潰是因爲變量在使用之前被釋放。如果您不立即使用返回值,而是將其存儲在成員變量中,則建議調用retain

... 
myMemberVariable = [something utf8String]; 
[myMemberVariable retain]; 
... 

爲了確保您不會產生內存泄漏,您必須在某處釋放成員變量。一個好的地方是dealloc

- (void)dealloc { 
    if (myMemberVariable) [myMemberVariable release]; 

    [super dealloc]; 
} 

我也推薦看看Advanced Memory Management Programming Guide來獲得關於iOS內存管理的一些詳細信息。

3

可可命名約定表明所有方法都返回自動釋放對象,但名稱以'init','copy'或'new'開頭的方法除外。靜態分析器知道並檢查它。

你有兩種選擇。您可以將該方法重命名爲-newUTF8String,或者您可以返回一個autorelease對象,並在要存儲此方法的返回值時保留它。

我寧願後者,但都將是有效的代碼。