【问题标题】:release vs autorease vs drain [closed]release vs autorease vs drain [关闭]
【发布时间】:2012-09-10 12:41:35
【问题描述】:

两者有什么区别。 什么是最好的? 你是否drain相同的release但不同的drain不保存retain,而release保存retain? autorelease 将对象保存在内存中一段时间​​。

【问题讨论】:

    标签: objective-c ios xcode cocoa-touch xcode4


    【解决方案1】:

    什么是最好的?答案当然是“视情况而定”。

    对于大多数 Cocoa 新手来说,我的看法是“以上都不是”——它是 ARC。尽管即使使用 ARC,对引用计数内存管理的一些了解也很重要,但您不必担心因过度释放而遗漏 releaseautorelease

    在上面@Anshuk Garg 描述的情况下,您在线程的自动释放池耗尽之前创建了大量临时对象,您可以将有问题的代码包装在@autorelease { ... } 块中。仪器可以告诉您您的内存占用是否是这些设置中的问题。

    【讨论】:

    • 你我的话在自动释放中是否正确将对象保存在内存中一段时间​​。和雨不保存保留,而释放保存保留?!
    • 我理解正确吗?是的,我想是的。
    【解决方案2】:

    drain 相同release但不同drain不保存retain,而release保存retain,autorelease保存对象在内存中一段时间​​。

    【讨论】:

    • 我不知道你在这里想说什么。
    【解决方案3】:

    发布: 在引用计数环境中,由于无法保留自动释放池,因此此方法会减少保留计数。当自动释放池被释放时,它会向其所有自动释放的对象发送“释放”消息。另外,在垃圾回收的环境中,这种方法是不行的。

    - (void)release
    

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

    - (void)drain
    

    结论: 从上面的简短讨论中可以清楚地看出,对于自动释放池(可以是 Cocoa 或 Cocoa touch),我们应该始终使用 'drain' 而不是 'release'。

    发布与自动发布 在大多数情况下,这两种方式都无关紧要。因为 -autorelease 仅仅意味着对象将在当前运行循环的迭代结束时被释放,所以无论哪种方式,对象都会被释放。

    使用 -autorelease 的最大好处是您不必担心方法上下文中对象的生命周期。因此,如果您稍后决定要在对象最后一次使用几行后对其执行某些操作,则无需担心将调用移至 -release。

    使用 -release 与使用 -autorelease 的主要区别在于,如果您在方法中创建了大量临时对象。

    【讨论】:

    • "release ... 导致接收器被释放。"那是错的。它减少接收器的保留计数。当保留计数变为零时,接收器被释放。 - “release vs autorelease 在大多数情况下,无论哪种方式都无关紧要” 这也是错误的。如果你从函数中返回一个对象,那会有很大的不同。
    • 我同意在调用释放时减少保留计数。从函数返回对象是完全不同的情况。在这里,我以相同的方法解释了简单的发布与自动发布。
    • 但你还是错了,安舒克。 :-)
    猜你喜欢
    • 2018-07-03
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2023-04-09
    • 2011-07-08
    • 2017-06-20
    相关资源
    最近更新 更多