【发布时间】:2012-01-31 15:45:03
【问题描述】:
我对 NSAutorelease 池的工作原理有一个大致的了解。 我们在其中有自动释放的对象,并且在调用 drain 方法时。 检查池中保留计数为 +1 的对象,并因此被释放。
但我不确定的是。 我们在主线程中创建 NSAutoRelease 池对象,并为每个线程创建一个对象。 线程如何与该特定池相关。 如果我们在一个线程中创建两个或多个自动释放池会发生什么。
我们只是创建池对象并在工作完成后将其排出。 它不像我们得到一个单身人士或其他东西。
那么线程如何到达那个特定的池?
我所说的保留计数 1 的场景解释。[略有错误,请阅读编辑]
- Obj A 有一个方法 createAndReturn。
- createAndReturn 创建一个对象 autorel_obj 并返回它。
现在它不能只释放它,因为它必须返回它。 所以它会自动释放它并返回。
因此 autorel_obj 将在自动释放池中。 现在说 objB 调用了 ObjA 的 createAndReturn。
并获取 autorel_obj 并保留它,否则自动释放池将耗尽它。 现在当它被 objB 保留时,它的保留计数为 2。
[这里是不正确的部分,编辑]
自动释放池只能释放 autorel_obj,直到它也被 objB 使用。 这就是为什么在 objB 也释放它并且它的保留计数变为 '1' 之前,它不能被释放。
所以通过retainCount 1,我的意思是将它发送到池的对象是唯一拥有它的对象。
关于池和线程的关系,Firoze Lafeer 的回答很有帮助。
编辑以保留第 1 个场景: 正如 Firoze 正确指出的那样, 我之前对保留计数 1 的解释需要更改。
autorel_obj 只会在池耗尽时被释放,因此它的保留计数将减少 1。 它不会从内存中释放。 一旦 autorel_obj 的所有其他所有者 obj 释放它,它的保留计数变为 0。 那么只有它会从内存中释放出来。
抱歉给大家带来了麻烦,感谢 Firoze 的更正。
【问题讨论】:
-
简而言之;自动释放池和线程是完全正交的;不相关。
标签: objective-c ios nsthread nsautoreleasepool