2

代碼:我應該如何正確釋放這個NSString?

- (void) foo : (NSString*) ori_string 
{ 
    her_string = [ori_string copy]; 

    while ([her_string length]>0) 
    { 
     her_string = [her_string substringFromIndex:1]; 
     //do something... 
    } 

    [her_string release]; //Here is the problem 
} 

大家好,

如果我釋放her_string像上面的分析說,it's an incorrect decrement of the reference count of an object that is not owned at this point by the caller

否則,如果我不釋放它,它說這是潛在的內存泄漏。

在哪裏以及如何釋放它?謝謝!

回答

10

刪除[her_string release]行,並將autorelease添加到copy

- (void) foo : (NSString*) ori_string 
{ 
    her_string = [[ori_string copy] autorelease]; 

    while ([her_string length]>0) 
    { 
     her_string = [her_string substringFromIndex:1]; 
     //do something... 
    } 
} 

的問題是,copy返回必須被釋放的字符串,而你用substringFromIndex電話覆蓋串失去引用。在丟失引用之後,它永遠不會被正確釋放,因此字符串的第一個複製版本會泄漏(如果length > 0,否則代碼會正確釋放該字符串)。

substringFromIndex返回一個已經自動發佈的字符串,所以你不必擔心它,直到你希望字符串保持在當前的自動釋放池之外。

+0

我完全明白了。謝謝邁克爾! – Skyler 2011-12-16 07:34:03

-2

你不必以釋放[NSString的副本] 你只釋放被創建的對象返回的NSString [XXXX頁頭] INIT]

IOS 5使用ARC,你永遠不需要擔心時釋放或保留,如果你使用ARC

+2

如果你沒有使用ARC(我們需要根據問題假設),那麼必須發佈**副本。記住NARC;新的,Alloc,保留,複製。所有這四個必須被釋放。 – 2011-12-16 07:22:11