Multithreading 什么是“;自动释放,无池到位”;什么意思?

Multithreading 什么是“;自动释放,无池到位”;什么意思?,multithreading,cocoa,debugging,objective-c++,Multithreading,Cocoa,Debugging,Objective C++,我的申请结构如下:, 核心部分是用C++编写的,并且使用了大量的线程,我在上面的目标C中开发了UI。 如果我不执行线程,它可以正常工作,但我不能禁用、停止线程,UI在我看到的日志中随机崩溃,如下消息 __NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking 类似的信息不止一次出现, 通过Google来了解,我需要设置NSAutoRe

我的申请结构如下:, 核心部分是用C++编写的,并且使用了大量的线程,我在上面的目标C中开发了UI。 如果我不执行线程,它可以正常工作,但我不能禁用、停止线程,UI在我看到的日志中随机崩溃,如下消息

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking
类似的信息不止一次出现, 通过Google来了解,我需要设置NSAutoReleSeCo水池来摆脱它,但是如何将它与C++代码集成在一起。p> Edit:核心库将从UI激活,因此我想,可以安全地说UI在主线程中运行,库在不通知UI的情况下创建/终止线程, 在这种情况下,我可以在UI中调用AutoReleasePool吗


有人能为我指点迷津吗?

有关Cocoa多线程的知识,请参阅以下文档:

可以像以前那样设计应用程序,但要记住两件事:

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

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

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

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

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

    如果您决定在垃圾收集下运行代码,则需要在完成后发送池
    排放
    ,而不是
    释放
    ,以使池发挥作用。启用GC时,
    release
    autorelease
    消息不会执行它们甚至不会执行的任何操作。您的自动释放池将通过戳垃圾收集器响应
    drain
    ,这与释放池中的对象最接近


    有关于自动释放池等的更多信息。

    您好,让我尝试在我的问题中添加更多内容