3

デコード後にNSStringを返す単純な関数があります。アプリケーション全体で頻繁に使用していますが、使用するたびに(「リーク」ツールによると)メモリリークが発生するようです。リークは、自動リリースしても、返されるNSStringを割り当てる行に問題があることを示しています。関数は次のとおりです。

-(NSString *) decodeValue
{
 NSString *newString;
 newString = [self stringByReplacingOccurrencesOfString:@"#" withString:@"$"];
 NSData *stateData = [NSData  dataWithBase64EncodedString:newString];
 NSString *convertState = [[[NSString alloc] initWithData:stateData encoding:NSUTF8StringEncoding] autorelease];
 return convertState;
}

[autorelease]についての私の理解は、まさにこの方法で使用する必要があるということです...関数でオブジェクトを返すのに十分な時間オブジェクトを保持し、後でオブジェクトを自動解放させたい場合です。したがって、手動で何もリリースしなくても、このようなコードでこの関数を使用できると思います。

NSString *myDecodedString = [myString decodeValue];  

しかし、このプロセスはリークを報告しており、リークを回避するためにそれを変更する方法がわかりません。私は何が間違っているのですか?

4

2 に答える 2

5

リークがあなたを迷わせていると思います。リークは、リークされているオブジェクトが最初に割り当てられた場所を示しますが、必ずしもリークの理由と同じではありません。このコードは問題ないようです。おそらく何が起こっているのかというと、この結果はどこかの別のクラスに保持されており、そこでリリースされることはありません。

于 2010-03-28T16:07:03.167 に答える
0

Jexeは正しいです。リークツールは、リークがどこにあるかを知ることはできません。インスタンスの作成ポイントと、RunLoopの最後にオブジェクトがまだ保持されていることだけを知っているので、alloc呼び出しを指しているのです。それはまだ大きな助けです、今あなたは他に誰がconvertStateにアクセスしてそれを保持しているのかを理解する必要があります。

于 2010-03-28T17:03:16.607 に答える