iphone:如何解决这个内存泄漏?

Posted

技术标签:

【中文标题】iphone:如何解决这个内存泄漏?【英文标题】:iphone : how to solve this memory leak? 【发布时间】:2011-10-10 14:38:07 【问题描述】:

如何解决这个内存泄漏......我什至在最后释放它,但它仍然存在。在 if statment 几乎 10-15 条件下,它的使用就像给定的代码一样......但最后我释放了它。

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


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

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

【问题讨论】:

你在创建它的if之外释放字符串 【参考方案1】:

没有发布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 的问题。在运行 Instruments 之前使用“Analyze”。

【讨论】:

Build and Analyze 确实抱怨这种事情,但我不相信它应该这样做。 为什么不应该呢?我不是在谈论由内部消息字符串隐藏外部消息字符串;我说的是OP没有释放内部messageString的事实。好吧,我没有在回答中这么说:p【参考方案2】:

看看你是否将它保留在代码的其他地方。如果是这样,那可能需要额外的版本。另请注意,您可能使用传递 messageString 作为参数的方法也可能会保留它。

【讨论】:

【参考方案3】:

确保释放if 块内的字符串。

【讨论】:

【参考方案4】:

基本的经验法则是,对于每个 allocnewretaincopy,您需要一个 releaseautorelease。您似乎在某处缺少releaseautorelease

顺便说一句,在部署到测试设备之前,您可以(并且应该)使用 Xcode 的“构建和分析”来帮助发现内存泄漏。

【讨论】:

以上是关于iphone:如何解决这个内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏 - iPhone

iphone内存泄漏教程

iPhone内存泄漏问题?

iPhone/iPad 应用程序内存泄漏

什么是内存泄漏?该如何检测?又该如何解决?

Iphone SDK Utility Application 模板有泄漏