2012-01-02 80 views
1

我对NSAutorelease池如何工作有一个大致的想法。 我们有它的对象,它们是自动释放的,当调用drain方法的时候。 将检查pool是否为retaincount为+1的对象,并因此解除分配。线程与NSAutorelease池有什么关系?

但我不确定的是。 我们在主线程中为每个线程创建一个NSAutoRelease池的对象。 线程是如何与特定池相关的。 如果我们在一个线程中创建两个或更多个自动释放池,会发生什么情况。

我们刚创建池对象并在完成工作时将其耗尽。它不像我们得到一个单身人士或其他东西。

那么线程如何到达特定池?

的就是我所谓的保留计数1稍微不正确,阅读编辑]

  • 的OBJ A有一个方法createAndReturn方案的说明。
  • createAndReturn创建一个对象autorel_obj并返回它。

现在它不能只是释放它,因为它必须返回它。 所以它会自动释放它并返回。

因此autorel_obj将在自动释放池中。 现在说objB调用ObjA的createAndReturn。

并获取autorel_obj并保留它,否则autorelease池将耗尽它。 现在,当它是由objB保留,其保留数为2

[这是不正确的部分纠正了,在EDIT]

自动释放池只是不能释放autorel_obj直到它也被也使用objB。 这就是为什么直到objB也释放它,其保留计数变为'1',它不能被释放。

所以通过retainCount 1,我的意思是发送给池的对象是唯一拥有它的对象。

和关于池和线程的关系,Firoze Lafeer的回答很有帮助。

编辑保留计数1种方案: 作为正确地指出由Firoze, 我前面保留计数1,需要一个变化的解释。

autorel_obj只会在池被耗尽并因此其保留计数减少1时被释放。 它不会从内存中释放。 一旦autorel_obj的所有其他所有者obj都释放它,并且其保留计数变为0. 那么只有它从内存中被释放。

对不起所有的麻烦,感谢Firoze的更正。

+0

总之;自动释放池和线程完全正交;无关。 – bbum 2012-01-02 18:20:35

回答

3

将检查池的retaincount为+1的对象,并因此解除分配。

我不确定我是否完全理解该声明,但这听起来对我不正确。 autorelease没有任何条件。如果你自动释放一个对象,那么当池被耗尽时,它会被释放,不管它在那一点上的保留数是多少(即使对象已经被释放!)。最好将“autorelease”看作“延迟释放” 。

至于另一个问题,每个线程维护自己的一堆autorelease池。每个池都与一个(且只有一个)线程关联。

哪个线程是与给定池关联的?答案是无论哪个线程创建池。如果您已经创建了一个新的池,那么新池将“嵌套”到现有池中。当该池被耗尽时(当该池的范围结束时),在该新池的范围内自动释放的对象将被释放。

我希望有帮助吗?

编辑

为了解决您的编辑:

你的解释是不正确的。自动释放池可以并且在释放对象后立即释放该对象。它不会等待objB先释放它。它甚至不知道其他对象可能在您的示例中保留了autorel_obj。我认为你在释放和释放时感到困惑。

所以情况是这样的:

  • createAndReturn分配和自动释放autorel_obj(保留计数+1
  • objB保留autorel_obj(保留计数+2
  • 池排出,autorel_obj被池释放(保留计数+1
  • 在未来某个时间点,objB释放小号autorel_obj(保留计数)
  • autorel_obj被释放

所以,再一次,池不知道,不关心其他对象可能会保留它释放的对象。它无条件地发布,当排空时,无条件地。这可能不会导致对象立即被释放,但这不是池的问题。

+0

谢谢,这绝对有帮助。 – 2012-01-02 07:20:19

+0

在编辑的部分检查我的解释。 – 2012-01-02 07:24:44

+0

我没有看到一个编辑以外的几行空白行被删除? – 2012-01-02 07:32:13