Ios 使用ARC,没有为每个线程设置自动释放池是致命的吗?

Ios 使用ARC,没有为每个线程设置自动释放池是致命的吗?,ios,multithreading,cocoa-touch,nsautoreleasepool,Ios,Multithreading,Cocoa Touch,Nsautoreleasepool,我读到: 如果在应用程序中创建辅助线程,则需要为其提供自己的自动释放池。自动释放池及其包含的对象将在中进一步讨论 在iOS5开发者食谱中 我在用ARC编译。我已经创建了许多背景线程,看起来我做得很好。我的后台线程都不是长时间运行的。所有这些对象都会被主线程的自动释放池释放吗?还是什么 这就是我所谓的后台线程: +(void)doBackground:(void (^)())block { //DISPATCH_QUEUE_PRIORITY_HIGH //dispatch_asyn

我读到:

如果在应用程序中创建辅助线程,则需要为其提供自己的自动释放池。自动释放池及其包含的对象将在中进一步讨论

在iOS5开发者食谱中

我在用ARC编译。我已经创建了许多背景线程,看起来我做得很好。我的后台线程都不是长时间运行的。所有这些对象都会被主线程的自动释放池释放吗?还是什么

这就是我所谓的后台线程:

+(void)doBackground:(void (^)())block
{
    //DISPATCH_QUEUE_PRIORITY_HIGH
    //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
    dispatch_async(dispatch_get_global_queue(-2,0), ^{
        block();
    });
}
我应该改成

+(void)doBackground:(void (^)())block
{
    //DISPATCH_QUEUE_PRIORITY_HIGH
    //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
    dispatch_async(dispatch_get_global_queue(-2,0), ^{
        @autoreleasepool{
        block();
        }
    });
}

现在似乎自动释放池是为新线程自动创建的。不知道这是什么时候改变的,也不知道为什么文档中的状态与此相反,但仅此而已。

如果您没有为新线程创建自动释放池,则至少应将其视为程序员错误。这对程序是否致命取决于程序的实现。典型的问题是对象泄漏,因此对象的dealloc永远不会执行(可能是致命的)

在ARC下创建自动释放池的现代方法是:

void MONThreadsEntry() { // << entry is e.g. a function or method
  @autoreleasepool {
    ...do your work here...
  }
}

void MONThreadsEntry(){//您使用的是GCD、NSOperation还是NSThread?GCD。这是行业标准,对吗?iOS文档中的这段引用将有助于进一步了解Cocoa应用程序中的每个线程都维护自己的自动释放池块堆栈。如果您正在编写仅限Foundation的程序或分离线程,则需要创建自己的自动释放池块。“是的,此引文出自“modern”下的什么意思?以前在本例中记录的消息类似于”自动释放,无池到位,只是泄漏".我现在检查了,没有消息,对象被正确释放,当我调试时,线程退出内部的某个地方发生了池排空。这与以前的行为和文档明显不同。最近发生了一些变化…随着ARC的引入,自动释放池被重写。因此,这影响了ts iOS 5.0及更高版本,以及任何OS X有ARC的版本。以前,您有一个NSAutoreleasePool对象的线程锁堆栈。现在,它是一种不同的机制,可以被认为是池边界所在位置具有哨兵值的单个数组。由于不再有离散池对象堆栈,因此每个线程都有一个隐式的“池”,但我认为如果您没有使用自己的线程,它还是会第一次尝试记录日志。似乎您是对的。您是从哪里知道这一点的?我想知道为什么有关线程的官方文档没有更新以反映这些更改。是的,我指的是这些说明。当然,每个线程都有自己的池更好(不仅仅是这样)。但他们至少可以在发行说明的某个地方包含此内容:)无论如何,感谢您提供的信息。没有完全不同。我同意您应该创建自己的池。虽然目前自动为GCD队列和NSThreads提供池,并且您的对象在任何情况下都不会泄漏,但最好为其创建自己的池将要在其中创建许多Cocoa对象的代码部分—不仅在后台线程中,而且在多次迭代的循环中也是如此。主UI线程池在每次runloop迭代中都会被耗尽,而系统提供的后台线程池将在线程退出之前被耗尽。@JimThio我认为您理解错误tood;我没有说GCD没有创建线程,我说的是你没有创建线程。GCD调度队列的操作更像线程池,而不是线程;它没有为你提交的每个任务生成新线程。是的,GCD将在幕后创建和管理线程,但机制(主要)是从您那里抽象。设置自己显式创建的线程时所经历的步骤(例如,使用pthreads或NSThread)是一个不同的场景/进程。这是一个重要的区别,因为自动释放池是线程本地的。我明白了。我的意思是,当线程空闲或完成时,GCD将自己创建自动释放池。只要我使用GCD,我不需要创建自己的自动释放池。@JimThio“…GCD将自行创建自动释放池”正确。“只要使用GCD,我不需要创建自己的自动释放池。"嗯,不,这不是我在更新-调度队列中写的。我鼓励您创建它们,即使在绝大多数情况下您实际上不需要创建它们。问题是您无法动态确定何时不需要它们。许多对98%覆盖率感到满意的人永远不会为此创建它们原因。奥托,一个高标准的库开发人员可能总是创建它们。@JimThio附加说明:a)我曾经读到过它们(内部细节)每次完成任务后都要清空它们,但是实现可以随时更改。b)在现代操作系统版本中创建自动释放池非常便宜。两个答案都是+1。这个答案显然要全面得多。