【问题标题】:What does “Autoreleased with no pool in place” mean?“Autoreleased with no pool”是什么意思?
【发布时间】:2011-01-22 15:49:05
【问题描述】:

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

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

类似的消息不止一次出现, 通过谷歌搜索知道,我需要设置 NSAutoReleasePool 来摆脱它,但是如何将它与 C++ 代码集成。

编辑: Core lib 将从 UI 激活,因此我想,可以肯定地说 UI 正在主线程中运行,Lib 正在创建/终止线程而不通知 UI, 在这种情况下,我可以在 UI 中调用 AutoReleasePool

谁能指导我?

【问题讨论】:

    标签: multithreading cocoa debugging objective-c++


    【解决方案1】:

    请参阅这些文档,了解有关 Cocoa 多线程的知识:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

    按照您的方式设计您的应用是可以的,但应牢记两点:

    1. 当在主线程上操作像视图(AppKit 或 UIKit)这样的 UI 控件时,生活是最简单的(有时是必要的)。您可以在后台线程上使用 Foundation 对象和一些 AppKit/UIKit 对象,并且可以在多个线程中使用一些 Foundation 对象。
    2. 如果您在后台线程中使用任何 Cocoa 对象,则需要在这些线程上设置自动释放池。

    像这样:

    - (void)backgroundThreadStart 
    {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        // do stuff
    
        [pool release];
    }
    

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

    【讨论】:

    • 您好,让我尝试在我的问题中添加更多内容
    【解决方案2】:

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

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

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

    The Memory Management Programming Guide for Cocoa 提供有关自动释放池等的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多