2012-08-04 114 views
5

在iOS应用程序开发中,我们使用NSAutoreleasePool在稍后的时间点放弃对象的所有权。为什么我们需要为每个线程使用NSAutoreleasepool?

但为什么它可以在不同的线程之间共享?

为什么我们需要在使用新线程时创建一个新的autoreleasepool?

编辑:

正如taskinoor提到我的问题是,为什么这样的设计是在这样一种方式,每个线程应该有一个单独autoreleasepool。

+1

[这个问题似乎与你的问题非常相关](http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) – 2012-08-04 13:05:13

+1

你应该考虑使用'@ autoreleasepool {...}而不是'NSAutoreleasePool'。根据文件,它更有效率。如果你迁移到ARC,这是强制性的。 – 2012-08-04 13:07:03

+0

我不知道你为什么需要这个编辑,我的回答解释了它的原因:) – 2012-08-04 13:18:49

回答

5

多线程自动释放池的设计挑战是何时排除它们。如果在对象仍在使用时耗尽游泳池,则会崩溃。每个线程都可以很容易地判断出您是否在运行循环之外,从而可以排除自动释放的对象。在多线程情况下,您的线程需要在runloop结束时进行同步,因此您可以确定自己处于安全的状态以排除它们。以这种方式同步踏板是一个坏主意,它会产生大量空闲时间并减慢程序速度。

+1

更进一步;如果任何线程被阻塞等待任何事情 - 网络,线程状态,其他I/O - 那么总体池不能被耗尽。 – bbum 2012-08-04 16:09:08

0

我不认为自动释放池线程之间共享,根据apples memory management guide可可每个线程都有自己的自动释放池

的堆栈如果没有为您创建线程或一个自动释放池分离,然后自动释放功能不起作用,所以内存占用将增长

2

每个线程是一个不同的执行上下文 - 一个线程可能迟早会退出,他们可能会使用不同的生命周期和内存管理需求的资源,所以每个线程线程应该被独立管理。

1

因为他们以这种方式设计。我想你的问题是他们为什么这样设计的。我不是100%肯定的,但一个可能的原因可能是跨线程共享资源具有成本。在对共享池的每次修改期间,每个线程都需要锁定解锁以降低性能。只有在需要共享的情况下,资源应该在多个线程之间共享,而autorelease池则不是这样。使用专用的autorelease池会表现更好。这可能是这个设计决定的一个可能的原因。

+0

谢谢Taskinoor – Krishnan 2012-08-04 13:32:13

+1

好猜,但不完整。自动释放池必须是每线程的,因为如果没有*所有线程*处于其池可能被耗尽的状态,就无法安全地排空池。如果*任何线程*被阻塞等待输入,则漏失不会发生。 Jeffeery的回答是正确的。 – bbum 2012-08-04 16:08:12

+1

@bbum,谢谢。我并没有想过要把池子倒掉,我同意杰弗瑞的答案比我的好。 – taskinoor 2012-08-04 16:21:59