2011-10-10 37 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的“构建和分析”来帮助您在部署到测试设备之前发现内存泄漏。