我对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的更正。
总之;自动释放池和线程完全正交;无关。 – bbum 2012-01-02 18:20:35