2011-10-10 27 views
0

このメモリリークを解消する方法...私は写真のように最後にそれをリリースしますが、それはまだそこにあります。もし10-15のstatmentが与えられたコードのように使用しているとすれば...しかし、最後に私はそれをリリースします。iphone:どのようにこのメモリリークを解決するには?

enter image description here

LoginResponse *response = [[LoginResponse alloc] initWithMessageString: messageString]; 


ServerMessage *ackMessage = [[ServerMessage alloc] initWithMessageToAck:response]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:ackMessage]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"LoginResponseReceived" object:response]; 
+1

あなたはそれを作成する場所の 'if'の外に文字列を解放します –

答えて

3

あなたはではありません。messageStringです。あなたは何をしているのですか:

// there's a messageString 
if(...){ 
    NSString* messageString= [[NSString alloc] init ... ] 
            // you're declaring new messageString, 
            // not related to the outer messageString 
    ... 
    // and you didn't release the inner messageString. 
    // The pointer messageString just goes away. 
} 
[messageString release]; // you're releasing outer messageString, not inner messageString. 

「分析」をXCodeから実行します。 (それは "ビルド"メニュー項目の下にあります)。私は内部を解放することを忘れるこの問題を捕らえるべきだと思いますmessageString。インストゥルメントを実行する前に「分析」を使用してください。

+0

Build and Analyzeはこの種のことについて文句を言いますが、私はそれがすべきであると確信していません。 – Moshe

+2

なぜそれはしないでください?私は内側のmessageStringによって外側のメッセージ文字列が隠れているのではない。 OPが内部messageStringをリリースしなかったという事実について私は話していました。まあ私は私の答えでそれを言っていない:p – Yuji

0

あなたがコードのどこかにそれを保持しているかどうかを確認します。もしそうなら、余分なリリースが必要かもしれません。また、あなたが引数としてmessageStringを渡すことを使用しているかもしれないメソッドがそれを保持しているかもしれないことにも注意してください。

0

ifブロック内の文字列を解放してください。

0

親指の基本的なルールは、すべてのallocnewretain、またはcopyのために、あなたはreleaseautoreleaseを必要とするということです。あなたはreleaseまたはautoreleaseのどこかに足りないと思われます。

ちなみに、Xcodeの「ビルドと解析」を使用して、テストデバイスに展開する前にメモリリークを見つけることができます。

関連する問題