首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程如何与其NSAutorelease池相关?

线程如何与其NSAutorelease池相关?
EN

Stack Overflow用户
提问于 2012-01-02 06:37:46
回答 1查看 279关注 0票数 1

我对NSAutorelease池的工作原理有一个大致的了解。我们在其中有对象,这些对象是自动释放的,并且是在调用drain方法时释放的。将检查池中是否有保留计数为+1的对象,并因此而取消分配。

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

我们只需创建池对象,并在完成工作后将其耗尽。不是说我们有单身的孩子什么的。

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

解释我所说的保留计数1.稍微不正确,请阅读编辑

createAndReturn.

  • createAndReturn有一个方法
  • Obj A创建对象autorel_obj并返回它。

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

因此,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。然后,只从内存中释放它。

很抱歉给你添麻烦了,谢谢菲罗兹的纠正。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-02 06:46:22

检查池中是否有保留计数为+1的对象,并因此而取消分配。

我不确定我是否完全理解那句话,但对我来说听起来不正确。自动释放没有任何条件。如果您自动释放一个对象,那么它将在池被耗尽时释放,而不管它在这个点上的保留计数(即使该对象已经被解除分配!)最好把“自动发布”看作是“延迟发布”。

至于另一个问题,每个线程都维护自己的自动释放池堆栈。每个池都与一个(和一个)线程相关联。

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

我希望这能帮上忙?

编辑

要处理编辑,请执行以下操作:

你的解释不正确。自动释放池能够并且确实在对象耗尽后立即释放它。它不会等待objB首先发布它。它甚至不知道示例中哪些其他对象可能保留了autorel_obj。我想你把释放和取消分配混为一谈。

所以情况是这样的:

  • createAndReturn分配并自动释放autorel_obj (保留计数为+1)
  • objB保留autorel_obj )(保留计数+2)
  • pool已耗尽,autorel_obj由池释放(保留计数+1)
  • at未来某个点),objB释放autorel_obj ( retains )
  • autorel_obj是解除分配

)。

因此,同样,池不知道也不关心其他对象可能保留了它正在释放的对象。它做了释放,当排水时unconditionally,。这可能不会导致立即释放对象,但这并不是池的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8698097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档