释放vs autorease vs drain

时间:2012-09-18 09:10:12

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

有什么区别。 什么是最好的? 您是否消耗相同的发布但是排水管中的不同不保存保留,而发布保存保留? autorelease 将对象保存在内存中一段时间​​。

3 个答案:

答案 0 :(得分:3)

什么是最好的?答案当然是'它取决于'。

对于Cocoa的大多数新人来说,我的观点是“以上都不是” - 它是ARC。虽然使用ARC,但对引用计数内存管理的一些理解很重要,您不必担心错过releaseautorelease过度释放。

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

答案 1 :(得分:1)

排出相同的释放但不同的排放不保存保留,而释放保存保留,自动释放保存对象在内存中一段时间​​。

答案 2 :(得分:-4)

<强>释放: 在引用计数环境中,由于无法保留自动释放池,因此此方法会减少保留计数。当解除分配自动释放池时,它会向其所有自动释放的对象发送“释放”消息。此外,在垃圾收集环境中,此方法是否定的。

- (void)release

<强>漏极: 在引用计数环境中,释放并弹出接收器;在垃圾收集环境中,如果自上次收集以来分配的内存大于当前阈值,则触发垃圾收集。

- (void)drain

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

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

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

使用-release时的主要实例与使用-autorelease相比会产生明显的差异,如果你在方法中创建了很多临时对象。