gpt4 book ai didi

objective-c - 一个线程与它的 NSAutorelease 池有什么关系?

转载 作者:行者123 更新时间:2023-12-01 19:24:17 25 4
gpt4 key购买 nike

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

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

我们只是创建池对象并在工作完成后将其排出。
它不像我们得到一个单例或其他东西。

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

解释我所说的保留计数 1 的场景。[稍微不正确,阅读编辑]

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

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

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

    并获取 autorel_obj 并保留它,否则自动释放池将耗尽它。
    现在当它被 objB 保留时,它的保留计数为 2。

    [ 这是更正的不正确部分,EDIT ]

    自动释放池不能释放 autorel_obj,直到它也被 objB 使用。
    这就是为什么在 objB 也释放它并且它的保留计数变为“1”之前,它不能被释放。

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

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

    编辑以保留计数 1 方案:
    正如 Firoze 正确指出的那样,
    我之前对保留计数 1 的解释需要更改。

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

    很抱歉给您带来了麻烦,感谢 Firoze 的更正。

    最佳答案

    the pool is checked for objects with retaincount as +1, and are thus deallocated.



    我不确定我是否完全理解该陈述,但这对我来说听起来不正确。自动释放没有任何条件。如果您自动释放一个对象,它将在池耗尽时被释放,而不管它在那个时候的保留计数(即使该对象已经被释放!)最好将“自动释放”视为“延迟释放”。

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

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

    我希望这有帮助吗?

    编辑

    要解决您的编辑:

    你的解释不正确。自动释放池可以并且确实在对象耗尽后立即释放它。它不会等待 objB 先释放它。它甚至不知道您的示例中可能保留了哪些其他对象 autorel_obj 。我认为您将释放与释放混淆了。

    所以场景是这样的:
  • createAndReturn 分配和自动释放 autorel_obj(保留计数为 +1 )
  • objB 保留 autorel_obj (保留计数 +2 )
  • 池被耗尽,autorel_obj 被池释放(保留计数 +1 )
  • 在 future 的某个时候,objB 会发布 autorel_obj (retain count 0 )
  • autorel_obj 被释放

  • 因此,池不知道也不关心其他对象可能保留了它正在释放的对象。它会发布, 无条件 , 排水时。这可能不会导致对象立即被释放,但这不是池的问题。

    关于objective-c - 一个线程与它的 NSAutorelease 池有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8698097/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com