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