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】:基本的经验法则是,对于每个 alloc
、new
、retain
或 copy
,您需要一个 release
或 autorelease
。您似乎在某处缺少release
或autorelease
。
顺便说一句,在部署到测试设备之前,您可以(并且应该)使用 Xcode 的“构建和分析”来帮助发现内存泄漏。
【讨论】:
以上是关于iphone:如何解决这个内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章