2010-12-27 4 views
4

私はアプリでメモリリークを減らそうとしているので、私はすべてのリークを見つけるために機器を使用しました。私は非常に迷惑なものを除いて、ほぼすべての漏れを取り除くことができました。NSPlaceholderstringのリークを示す機器

インストゥルメントには、NSPlaceholderstringリークがたくさんあることがわかります。 (楽器に従って)、漏れが発生したコードは次のとおり

if (nil == storedHash) 
{ 
    NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service]; 
    self.storedHash = description; // This line is the leak according to instruments 

    [description release]; 
    description = nil; 
} 

return storedHash 

storedHashは次のように定義され:

  • 私が使用:私は私が考えることができるすべてを試み
    @property(copy) NSString* storedHash; 
    

    コピーの代わりに保持
  • NSString(stringWithFormat)の自動解放割り当てを使用しました
  • 自動解放プールでコードをラップしようとしました

上記のいずれもリークを変更しませんでした。 (場合によっては漏れのタイプが変わりますが、まだ漏れがあります)

アイデアは誰ですか?

答えて

0

deallocの方法はどうですか? deallocメソッドでstoredHashを解放しましたか?そして、チェックはどうですか?if (nil == self.storedHash)

+0

この場合、 'self.storedHash'対' storedHash'は無関係です。 – bbum

5

storedHashをどこから解放しますか?あなたはdeallocにそれをリリースしますか?

NSPlaceholdeStringは実装の詳細です。それはNSString+allocメソッドによって返されたインスタンスのクラスです。

+0

ありがとう、それはdeallocでした。 – Adam

+0

'NSPlaceholderString'についての説明のために+1 – Saphrosit

+0

deallocメソッドでself.storedHashを解放することで問題は解決しますか? – Satyam

0

あなたはコピーの代わりに

@property(nonatomic, retain) NSString* storedHash; 

を使用する必要があります。 @property(copy)は古いNSObjectのを解放していなかった、あなたはそれを自分で行う必要があります。

if (nil == storedHash) 
{ 
    NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service]; 
    [self.storedHash release]; 
    self.storedHash = description; // This line is the leak according to instruments 

    [description release]; 
    // description = nil; // it's unnecessary 
} 

また、あなたはのdeallocでstoredHashを解放する必要があります。

関連する問題