“Autoreleased with no pool in place”是什么意思?

8

我的应用程序结构如下,核心部分是用C++编写的,大量使用线程,在其上我正在使用Objective C开发UI,如果我不执行线程,它可以正常工作,但我不能禁用、停止线程,UI会随机崩溃,在日志中我可以看到以下信息:

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking

类似的消息出现多次,通过谷歌搜索得知需要设置NSAutoReleasePool来解决,但是如何将其与C++代码集成呢。

编辑:核心库将从用户界面激活,因此我认为可以安全地说UI在主线程中运行,库正在创建/终止线程而不通知UI,在这种情况下,我可以在UI中调用AutoReleasePool吗?

有人可以指导我吗?

2个回答

7
请参考以下文档,了解有关在Cocoa中使用多线程的知识:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html 设计您的应用程序是可以的,但需要注意以下两点:
1. 当操作UI控件(如AppKit或UIKit中的视图)时,最好在主线程上进行,这样简单且有时也是必需的。您可以在后台线程中使用Foundation对象和一些AppKit/UIKit对象,而某些Foundation对象可以从多个线程中使用。
2. 如果您在后台线程中使用任何Cocoa对象,则需要在这些线程上设置自动释放池。
请按以下方式设置:
- (void)backgroundThreadStart 
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // do stuff

    [pool release];
}

这将修复你的控制台错误,但你可能还有其他问题导致了你实际看到的崩溃。


你好,让我试着在我的问题中添加更多内容。 - Amitg2k12

1

这意味着您在没有自动释放池的情况下自动释放了某些东西。

每个线程都有一个自动释放池堆栈。在主线程上,在Cocoa调用您的代码之前,会为您创建一个自动释放池,并在您的代码返回后进行清除。您自动释放的每个对象(无论是显式还是隐式)都会进入池中,以便在池被清空时释放它。当您创建线程时,必须自己在该线程上创建和清除自动释放池。(或者只是不自动释放任何内容,但对于任何有意义的代码量来说,这几乎是不可能的。)

如果您决定在垃圾回收下运行代码,则在完成后需要向池发送drain而不是release,以使池有用。启用GC时,releaseautorelease消息什么也不做,甚至不会经过。您的自动释放池将通过触发垃圾收集器来响应drain,这是与释放池中的对象最接近的等效操作。

Cocoa内存管理编程指南提供了有关自动释放池的更多信息,以及其他内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接