我对NSAutorelease池的工作原理有一个大致的了解。我们在其中有对象,这些对象是自动释放的,并且是在调用drain方法时释放的。将检查池中是否有保留计数为+1的对象,并因此而取消分配。
但我不确定的是。我们在主线程中创建NSAutoRelease池的对象,并为每个线程创建一个对象。线程如何与该特定池相关。如果我们在一个线程中创建两个或多个自动释放池,会发生什么情况。
我们只需创建池对象,并在完成工作后将其耗尽。不是说我们有单身的孩子什么的。
那么线程如何到达特定的池呢?
解释我所说的保留计数1.稍微不正确,请阅读编辑
createAndReturn.
现在它不能仅仅释放它,因为它必须返回它。所以它会自动释放并返回。
因此,autorel_obj将在自动释放池中。现在假设objB调用createAndReturn of ObjA。
并获得并保留autorel_obj,否则自动释放池将耗尽它。现在,当它被objB保留时,它的保留计数是2。
这里是在编辑中更正的不正确的部分
在autorel_obj也被objB使用之前,自动释放池不能释放它。这就是为什么直到objB也释放它,并且它的保留计数变成'1',它不能被释放。
所以说retainCount 1,我的意思是把它发送到池的对象是唯一拥有它的对象。
对于池和线程的关系,Firoze Lafeer的回答是有帮助的。
编辑以保留count 1场景:正如Firoze正确指出的那样,我先前对retain 1的解释需要更改。
autorel_obj只有在池耗尽时才会释放,因此它的保留数会下降1,不会从内存中释放。一旦autorel_obj的其他所有者obj释放它,它的保留计数就会变为0。然后,只从内存中释放它。
很抱歉给你添麻烦了,谢谢菲罗兹的纠正。
发布于 2012-01-02 06:46:22
检查池中是否有保留计数为+1的对象,并因此而取消分配。
我不确定我是否完全理解那句话,但对我来说听起来不正确。自动释放没有任何条件。如果您自动释放一个对象,那么它将在池被耗尽时释放,而不管它在这个点上的保留计数(即使该对象已经被解除分配!)最好把“自动发布”看作是“延迟发布”。
至于另一个问题,每个线程都维护自己的自动释放池堆栈。每个池都与一个(和一个)线程相关联。
给定的线程与哪个线程相关联?答案是,无论哪个线程创建了池。如果在已经存在的地方创建了一个新池,则新池将在现有池中“嵌套”。在该新池范围内自动释放的对象将在该池耗尽时(当该池的范围结束时)释放。
我希望这能帮上忙?
编辑
要处理编辑,请执行以下操作:
你的解释不正确。自动释放池能够并且确实在对象耗尽后立即释放它。它不会等待objB首先发布它。它甚至不知道示例中哪些其他对象可能保留了autorel_obj。我想你把释放和取消分配混为一谈。
所以情况是这样的:
)。
因此,同样,池不知道也不关心其他对象可能保留了它正在释放的对象。它做了释放,当排水时unconditionally,。这可能不会导致立即释放对象,但这并不是池的问题。
https://stackoverflow.com/questions/8698097
复制相似问题