【问题标题】:What's the difference between sending -release or -drain to an Autorelease Pool?将 -release 或 -drain 发送到自动释放池有什么区别?
【发布时间】:2010-10-22 07:07:25
【问题描述】:

在许多书籍和许多网站上,我都看到了 -drain。好吧,对于一个听起来很酷的自动释放池。但它除了发布之外还有其他作用吗?我猜 -drain 只是让 Pool 释放它的所有对象,而不释放 Pool 本身。只是猜测。

【问题讨论】:

    标签: iphone cocoa cocoa-touch memory-management autorelease


    【解决方案1】:

    请注意,关于 oxigen 的回答中的 cmets 说 -drain 不会释放 NSAutoreleasePool 是不正确的。 documentation for NSAutoreleasePool 明确表示 -drain 释放(并因此破坏)NSAutoreleasePool。

    -drain 是对 NSAutoreleasePool 对象使用 -release 的替代品,唯一的区别是它为垃圾收集系统提供了提示。

    【讨论】:

    • 谢谢。所以在 iPhone OS 上最好使用 -release 而不是 -drain?
    • 在非 GC 环境中它们是相同的。除非在极少数情况下,如果代码曾经在 GC 模式下使用过,出于某种原因您不想向 GC 系统提供提示,则没有理由在针对 10.4+ 的代码中使用 release 而不是 drain。
    • Apple 事先不知道是否有人会将他们的程序目标设置为 10.4 之前的版本,并且在退出之前向 GC 系统提供提示没有任何价值,使发布成为更好的选择那个具体的案例。
    【解决方案2】:

    氧气是对的,参见NSAutoreleasePool的方法drain的文档:

    在引用计数环境中, 释放和弹出接收器;在一个 垃圾收集环境, 触发垃圾收集,如果 自上次分配的内存 集合大于当前 阈值。

    【讨论】:

      【解决方案3】:

      如果你的系统有垃圾回收,那么 -drain 为 GC 发送消息 (objc_collect_if_needed)

      如果你没有GC,那么drain = release

      【讨论】:

      • -retain 和 -drain 方法不会改变 NSAutoreleasePool 对象的 retainCount 他们只向池中的所有对象发送释放消息我不知道,NSAutoreleasePool 对象如何以及何时销毁(((
      • 不,排水管确实释放了水池。自动释放池和保留计数没有什么神奇之处,它们遵循与任何其他对象相同的规则,除了它们不能被保留或自动释放(无论如何这没有多大意义)。
      • Marc Charbonneau 但是为什么我可以写: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; [池释放]; [池释放]; [池释放]; [池释放]; ..... [池释放];这是工作。即使在此之后,pool retainCount = 1
      • 不应该的。实际上,ARP应该在-release之后被销毁,对吧?
      • oxigen,在您的示例中,在您的发布后没有发生分配,因此您可能只是在与被破坏对象的完整但现在是垃圾的内存进行交互。仅仅因为对被破坏对象的调用恰好起作用并不意味着该调用是有效的。至于retainCount 返回1,也许retainCount 总是为NSAutoreleasePool 返回1,因为它有不寻常的retain 语义。即使有一些实现细节使其持续时间稍长,因为文档明确表示它在耗尽或释放时被释放,你应该假设它是。
      猜你喜欢
      • 2010-10-22
      • 2011-10-31
      • 1970-01-01
      • 2011-09-17
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多