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]行を削除し、を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は、すでに自動解放された文字列を返します。したがって、文字列を現在の自動解放プールの外に維持するまで、心配する必要はありません。あなたはNSStringのは、[NSStringのコピー] あなただけの[[XXXXののalloc]のinit]

IOS 5の使用ARCによって作成されたオブジェクトを解放することにより、返さ解放する必要はありません

+0

私はそれを完全に手に入れました。マイケルありがとう! – Skyler

-2

時期について、あなたは心配する必要はありませんあなたがARCで働いている場合に解放または保持する

+2

ARCを使用していない場合(質問に基づいて推測する必要がある)、コピー**をリリースする必要があります**。 NARCを覚えている。新規、割り当て、保持、コピー。それらの4つすべてがリリースされなければならない。 –

+0

私のせい ARCに感謝してくれてありがとう – IPaPa

関連する問題