【发布时间】:2016-12-19 11:49:52
【问题描述】:
ARC 在运行时会做额外的事情吗? this answer 上的 cmets 说“ARC 在运行时增加引用计数,并且仅在它们达到零时才释放”。这是真的?如果是这样,如果在编译时添加发布调用,为什么要这样做?
【问题讨论】:
标签: objective-c swift memory-management automatic-ref-counting
ARC 在运行时会做额外的事情吗? this answer 上的 cmets 说“ARC 在运行时增加引用计数,并且仅在它们达到零时才释放”。这是真的?如果是这样,如果在编译时添加发布调用,为什么要这样做?
【问题讨论】:
标签: objective-c swift memory-management automatic-ref-counting
ARC 不是免费的 - 它会增加和减少引用计数,并在引用计数为 0 时释放对象。
与手动保留/释放相比,ARC 是正确的,它可能不那么频繁地调用保留/释放,因为它经常知道保留/释放对何时相互抵消,保留/释放更快,因为它不调用 Objective-C 方法调用(在 Objective-C 中,您可以覆盖保留/释放;使用 ARC 则不能)。
【讨论】:
ARC 遵循与 C++ 的 std::shared_ptr 类似(如果不相同)的机制,它使用引用计数来查看当对象超出范围时是否应该调用退出时间函数;在 Obj-C 的情况下,该调用将被释放。
编译器添加的释放调用来管理引用计数如何递减; clang 机制的执行方式非常简洁,省去了检查是否有平衡调用来释放对每个增加引用计数的方法的调用的麻烦。
因此,关于您最初的问题,ARC 不应在您的运行时应用程序中产生额外的性能成本。
如果您怀疑您的应用存在内存问题,您应该在 Instruments 中分析您的应用并查看花费的时间。
内存优化是一个完全不同的蜡球,幸好有解决方案。因此,如果您有一个高度线程化的应用程序,在并发内存分配方面存在问题,您可以查看一个开源库,例如 Intel 的 Thread Building Blocks,它带有一个出色的内存管理器,但要注意,它是为 C/C++ 设计的.
顺便说一句,关于ARC的详细解释,请阅读本页:http://clang.llvm.org/docs/AutomaticReferenceCounting.html
【讨论】: