2

我知道类似的问题已被问及一次又一次,但我问你,请耐心与我,因为我似乎无法找到一个有用的答案。NSMutableString泄漏append或replaceOccurrencesOfString

我的应用程序有泄漏导致我不知所云。实际上,他们不会被泄漏泄漏使用,但是我的ObjectAlloc中的净字节上升,并且永远不会停止,如果时间足够长(不是很长),最终会导致崩溃。

问题发生在NSMutableStrings。我认为有一些基本的东西我不了解它们,或者我面临着另一个问题,那就是我无法追踪,但一直隐藏在NSMutableStrings之后。具体来说,我注意到,每当我追加或执行替换NSMutableString时,ObjectAlloc报告在调整NSMutableString大小时,场景后面的malloc/frees中出现的不匹配。我很抱歉地说,这是我第二次面临这个问题 - 第一次我搞砸了几个小时,最后问题消失了(魔术!),但我不知道为什么。

当我看下面的代码(并相信我,我盯着它几个小时),我看不到问题。我查看代码并认为我应该没问题,因为我释放了我负责的唯一对象(aString),并且NSMutableString应该在任何调整大小后处理清理。在第二个例子中,只要知道它有帮助,传入的字符串就来自一个ASIHTTPRequest对象(它是responseString),我什么都不做。它被称为就像这样([自我DoStuff2:[request responseString]]),我也没有自己释放请求(我使用ASINetworkQueue,我认为这些请求被破坏了我(我试过并导致错误因为请求已经在其他地方发布)

此外,我知道它不应该做任何事情,但我甚至尝试在autorelease池中包装代码,这当然没有任何作用。因为NSOperations应该为自己创建一个自动释放池,但我已经试过了,但没有成功。

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

我希望任何人都可以提供帮助。如果您需要更多信息,我很乐意添加它。我向你保证,我已经和这个(以及其他问题)斗争了几个星期,每遇到我遇到的每个问题,我都会努力研究,直到找到解决方案 - 这不是一个空闲的请求,而是真正的求救呼声!我写了这么多的代码,现在我试图密封一些小的泄漏等,我注意到这个问题。老实说,我无法相信目标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]; 
} 
+0

'someMutableStringVar'是一个'@ property'吗?如果是这样,它是如何定义的?你定义了一个自定义setter吗? – 2010-05-29 00:18:48

+0

Hi Shaggy Frog, 是的,someMutableStringVar是@synthesized属性(我使用默认的settter)。 – John 2010-05-29 00:26:55

+0

我想你最好能提供一个完整的例子供我们看看。我在你的代码中看到了一些奇怪的东西(例如,你为什么要用self。来读取实例自己的变量?),但是没有看到整体,很难找出一个特定的问题。我希望看到分配,释放,属性定义和(当然)泄漏。 :) – 2010-06-04 21:45:17

回答

0

我会建议的第一件事是做构建&分析。这通常可以帮助我找出明显的错误。

+0

嗨Alexsander, 我不得不谷歌!我应该提到我使用xcode 3.1.4(在Leopard上),所以没有构建和分析功能。然而,谷歌搜索告诉我,分析是由clang执行的,这是我用过并喜爱的工具,之前我的名字我不记得了!感谢您指出。 – John 2010-05-29 00:29:44

+0

做了一个分析,Clang在另一个完全分离的代码中只发现了一些问题。上面没有发现问题。再次感谢。 – John 2010-05-29 02:10:36

1

您发布的代码正确地遵守Cocoa内存使用指南。但是,您报告的症状是记忆力增加,而不是泄漏。您如何确定这些是增长发生的地点?仪器中的ObjectAlloc仪器可能会显示这些位置是否有大量静物分配?

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