NSMutableString在append或replaceOccurrencesOfString上泄漏

时间:2010-05-28 23:50:23

标签: iphone objective-c memory memory-management nsmutablestring

我知道一次又一次地问过类似的问题,但我请你耐心等待,因为我似乎无法找到有帮助的答案。

我的应用程序漏洞让我不在乎。实际上,他们没有使用泄漏报告泄漏,但我在ObjectAlloc中的净字节数上升和上升并且永不停止,如果持续时间足够长(不是很长),最终会导致崩溃。

NSMutableStrings出现问题。我认为有一些基本的东西我不了解它们,或者我面临另一个问题,我很难追踪但却一直躲在NSMutableStrings后面。具体来说,我注意到每当我在NSMutableString上追加或执行替换时,ObjectAlloc会在调整NSMutableString大小时报告场景后面的malloc / frees中看起来不匹配的内容。我很遗憾地说这是我第二次遇到这个问题 - 我第一次搞砸了几个小时,最后问题就消失了(魔术!)但是我真的不知道为什么。

当我查看下面的代码时(相信我,我已经盯着它看了几个小时)我看不出问题。我查看代码并自己思考我应该没问题,因为我发布了我负责的唯一对象(aString),NSMutableString应该在任何调整大小之后进行清理。在第二个例子中,只要你知道如果它有帮助,传入的字符串来自ASIHTTPRequest对象(它是responseString),我根本不做任何事情。它被简单地调用([自我DoStuff2:[请求responseString]])并且我自己也没有释放请求(我正在使用ASINetworkQueue并且我假设请求被破坏了(我尝试并导致错误)因为请求已经在其他地方发布了。)

另外,我知道它不应该做任何事情,但我甚至尝试将代码包装在自动释放池中,当然这没有做任何事情。我应该提一下,这段代码是在NSOperation中运行的。我想也许我遇到了问题,因为NSOperations应该为自己创建一个自动释放池,但我已经尝试过无效了。

与NSMutableString无关,但我发现使用NSString componentsSeparatedByString方法也存在类似的问题。有时,获取分离组件的数组使用的内存永远不会释放。嗯...字符串似乎对我来说似乎有些问题。

我很感激任何人都可以提供帮助。如果您需要更多信息,我很乐意添加它。我确实向你保证,我已经挣扎了几周(以及其他问题)我遇到的每一个问题我都在努力研究,直到我找到解决方案 - 这不是一个空闲的请求,而是一个真正的呼救!我写了很多代码,现在我正试图密封一些小泄漏等,我注意到这个问题。老实说,我无法相信Objective C中的内存管理有时会让我感到困扰......我已经多次读过Apple的内存管理文档了,我认为我完全理解它并且我努力想要释放我拥有的对象,但是有时候我发现自己想知道我是否真的理解......我想把它放到床上一次并确保我完全理解这一切 - 在编写了数千行代码之后出现这种问题/问题不仅仅是一点点吓人/尴尬/烦人。

再说一次,如果有人有任何见解,我将不胜感激。感谢您的时间和努力。

-(void)DoStuff
{
NSString *aString [ [[NSString alloc] initWithFormat:@"text %@ more text", self.strVariable];
[self.someMutableStringVar replaceOccurrencesOfString:@"replace" withString:aString options:NSCaseInsensitiveSearch range:NSMakeRange(0, [self.someMutableStringVar length])];
[aString release];
}


-(void)DoStuff2:(NSString *)aString
{
[self.someMutableStringVar appendString:aString];
}

2 个答案:

答案 0 :(得分:1)

您发布的代码正确遵守Cocoa内存使用指南。但是,您报告的症状是内存增长,而不是泄漏。您如何确定这些是增长发生的位置?据推测,仪器中的ObjectAlloc仪器显示了大量静止物体分配的这些位置?

如果是这种情况,我猜你可能会错过一个自动释放池。您显示的代码有许多操作可能导致对象被自动释放。如果在执行这些操作时没有活动的自动释放池,则不会正确释放该内存。如果您在没有设置自动释放池的后台线程中执行这些操作,则可能会发生这种情况。

答案 1 :(得分:0)

我建议的第一件事就是做一个 Build& amp;分析即可。这通常可以帮助我找出一些显然是错误的东西。