内存泄漏问题 NSAutoreleaseNoPool()
Posted
技术标签:
【中文标题】内存泄漏问题 NSAutoreleaseNoPool()【英文标题】:Memory leak problem NSAutoreleaseNoPool() 【发布时间】:2010-11-30 08:10:29 【问题描述】:我正在尝试创建一个不可变的字符串。我没有使用 init、alloc 或 new 对其进行初始化,但内存仍在泄漏,并且它说“NSCFString 类的对象 0x234b533 自动释放,没有适当的池 - 只是泄漏”这是我正在尝试做的事情
NSMutableString *srn = [NSMutableString stringwithCString:devSID];
// devSID is *char
这会留下泄漏。这个我也试过了
NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];
但这也不起作用,但是如果我尝试用这样的简单字符串初始化它
NSMutableString *srn = @"this is my string";
它有效,不知道周围发生了什么。我没有使用 init 或 alloc 但仍然存在泄漏。如果有人可以帮助我解决这个问题,我将不胜感激
问候
尤米尔
【问题讨论】:
你没有收到最后一个编译器警告吗? 【参考方案1】:泄漏是由于您自动释放对象而没有适当的自动释放池来处理它。这通常发生在您通过创建自己的线程或仅使用-performSelectorInBackground:withObject:
便捷方法在主线程之外进行操作时。如果你想使用自动释放功能(这里使用NSMutableString
类方法暗示),你需要在你将使用它的代码块的开头创建一个自动释放池,并在结尾。换句话说,大致是这样的:
- (void)myBackgroundThing:(id)whatever
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableString *srn = [NSMutableString stringwithCString:devSID];
// etc...
[pool release];
【讨论】:
即使一个不想想要使用自动释放功能,许多 Cocoa 对象还是会在幕后这样做,所以创建几乎总是一个好主意后台线程池。 实际上,在引用计数环境中,您应该始终为每个将使用 Cocoa 的线程创建一个自动释放池。如果你写一个独立的命令行工具,你也应该在main()
创建一个autoerelease池。
您正在使用NSMutableString
的方法,该方法返回一个自动释放的对象。因此,您需要一个自动释放池。至于你的应用程序在添加时崩溃,我们需要查看更多代码。
@Omayr - 导致崩溃的原因可能是您在池范围内创建了一个自动释放的对象,然后在池耗尽后尝试访问它。虽然 Tariq 仅添加保留的解决方案可能不会导致崩溃,但如果您不创建自动释放池并在完成后释放保留的对象,则会造成内存泄漏。诺亚是这里根本问题的正确解决方案。
因为其他人会阅读此内容并实施您错误标记为已接受的解决方案。因此,这个问题将继续困扰着开发人员。我们已经使用 php 复制和粘贴编码来实现这一点。由于这种类型的编码,多年前解决的问题仍然是一个问题。 Brad 的评论是正确的,并为阅读本文的任何未来开发人员提供了见解。这就是他发帖的原因。【参考方案2】:
试试这样的
[[NSString stringWithCString:"Hello"] 保留];
retain 是一种评估您最初未创建的对象的对象所有权的方法,因此这扩展了我们将每个分配与释放或自动释放匹配的规则
注意:如果您保留此对象,则必须平衡您的发布次数。如果你不释放保留的对象,那么你将面临内存泄漏问题。
【讨论】:
只有一行……这家伙解决了我的问题……谢谢哥们 你需要平衡retain
和以后的 release
否则你会泄漏内存。
@paul @Omayr 实际上问题是他在分配的 Autoreleasepool 中创建了一个自动释放对象。这就是为什么我建议他保留那个对象。现在他必须尽快释放那个对象因为他完成了功能部分
这个答案是错误的,因为它没有解决根本问题,并且会导致内存泄漏。正如 Noah 所说,需要有一个自动释放池,否则任何自动释放的对象都会泄漏。
只是一个评论,仅仅因为某些东西有效并不意味着它是正确的答案。找出应用程序中断的原因并为中断找到正确的解决方案是正确的解决方案。这就像在飞机上贴胶带一样。以上是关于内存泄漏问题 NSAutoreleaseNoPool()的主要内容,如果未能解决你的问题,请参考以下文章