【发布时间】:2012-09-10 12:41:35
【问题描述】:
两者有什么区别。 什么是最好的? 你是否drain相同的release但不同的drain不保存retain,而release保存retain? autorelease 将对象保存在内存中一段时间。
【问题讨论】:
标签: objective-c ios xcode cocoa-touch xcode4
两者有什么区别。 什么是最好的? 你是否drain相同的release但不同的drain不保存retain,而release保存retain? autorelease 将对象保存在内存中一段时间。
【问题讨论】:
标签: objective-c ios xcode cocoa-touch xcode4
什么是最好的?答案当然是“视情况而定”。
对于大多数 Cocoa 新手来说,我的看法是“以上都不是”——它是 ARC。尽管即使使用 ARC,对引用计数内存管理的一些了解也很重要,但您不必担心因过度释放而遗漏 release 或 autorelease。
在上面@Anshuk Garg 描述的情况下,您在线程的自动释放池耗尽之前创建了大量临时对象,您可以将有问题的代码包装在@autorelease { ... } 块中。仪器可以告诉您您的内存占用是否是这些设置中的问题。
【讨论】:
drain 相同release但不同drain不保存retain,而release保存retain,autorelease保存对象在内存中一段时间。
【讨论】:
发布: 在引用计数环境中,由于无法保留自动释放池,因此此方法会减少保留计数。当自动释放池被释放时,它会向其所有自动释放的对象发送“释放”消息。另外,在垃圾回收的环境中,这种方法是不行的。
- (void)release
排水: 在引用计数环境中,释放和弹出接收器;在垃圾收集环境中,如果自上次收集后分配的内存大于当前阈值,则触发垃圾收集。
- (void)drain
结论: 从上面的简短讨论中可以清楚地看出,对于自动释放池(可以是 Cocoa 或 Cocoa touch),我们应该始终使用 'drain' 而不是 'release'。
发布与自动发布 在大多数情况下,这两种方式都无关紧要。因为 -autorelease 仅仅意味着对象将在当前运行循环的迭代结束时被释放,所以无论哪种方式,对象都会被释放。
使用 -autorelease 的最大好处是您不必担心方法上下文中对象的生命周期。因此,如果您稍后决定要在对象最后一次使用几行后对其执行某些操作,则无需担心将调用移至 -release。
使用 -release 与使用 -autorelease 的主要区别在于,如果您在方法中创建了大量临时对象。
【讨论】: