2011-12-22 16 views
1

は私が言ってメッセージを取得します:潜在的なメモリリークが

- (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]; 
} 

私はまた、iOSののメモリ管理に関するいくつかの詳細な情報を取得するためにAdvanced Memory Management Programming Guideを見た推薦します。

3

ココア命名規則は、すべてのメソッドは、名前「INIT」、「コピー」または「新しい」で始まるメソッドを除いて、自動解放オブジェクトを返すことを示唆しています。スタティック・アナライザはこれを認識してチェックします。

2つの選択肢があります。あなたは-newUTF8Stringにメソッドの名前を変更したり、自動解放オブジェクトを返し、あなたは、このメソッドの戻り値を格納したいときにそれを保持することができます。

私は後者を好むだろうが、両方が有効なコードになります。

関連する問題