2011-10-10 71 views
0

如何解決這個內存泄漏......我甚至在最後發佈它,如在圖片中,但它仍然存在。在幾乎10-15的陳述中,它像使用給定的代碼一樣使用它......但是最終我釋放它。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'之外你創建它 – 2011-10-10 14:41:31

回答

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

構建和分析確實抱怨這種事情,但我不相信它應該。 – Moshe

+2

爲什麼不應該呢?我不是在談論內部messageString隱藏外部消息字符串的問題;我在談論OP沒有釋放內部messageString的事實。那麼在我的回答中,我沒有這麼說:p – Yuji

0

見,如果你在代碼中的其他地方保留它。如果是這樣,那可能需要額外的釋放。另外請注意,您可能正在使用的傳遞messageString作爲參數的方法也可能會保留它。

0

確保釋放if塊內的字符串。

0

拇指的基本規則是,每allocnewretain,或copy,你需要一個releaseautorelease。看來你在某處丟失了releaseautorelease

順便說一下,您可以使用Xcode的「構建和分析」來幫助您在部署到測試設備之前發現內存泄漏。