自动引用计数是否会在 运行 时间产生成本

Does automatic reference counting incur a cost at run-time

ARC 在 运行 时间做任何额外的事情吗? this answer 上的评论说 "ARC bumps reference counts at run-time and releases only when they reach zero"。这是真的?如果是这样,如果在编译时添加发布调用,为什么要这样做?

ARC 遵循与 C++ std::shared_ptr 类似的机制,如果不相同,它使用引用计数来查看,如果对象超出范围,则应调用退出时间函数;在 Obj-C 的情况下,该调用将被释放。

编译器添加的释放调用,用于管理引用计数的递减方式; clang 机制的工作方式非常简洁,让您省去检查是否有平衡调用以释放对每个增加引用计数的方法的调用的麻烦。

因此关于您的原始问题,ARC 不应在您的运行时应用程序中产生额外的性能成本。

如果您怀疑您的应用程序存在内存问题,您应该在 Instruments 中分析您的应用程序并查看时间花在了哪里。

内存优化是一个完全不同的蜡球,幸好有解决方案。所以,如果你有一个高度线程化的应用程序并发内存分配有问题,你可以看看像英特尔的线程构建块这样的开源库,它带有一个优秀的内存管理器,但要注意,它是为 C/C++.

顺便说一句,关于ARC的详细解释,请阅读此页:http://clang.llvm.org/docs/AutomaticReferenceCounting.html

ARC 不是免费的 - 它会增加和减少引用计数,并在引用计数为 0 时释放对象。

与手动retain/release相比,ARC会是正确的,它调用retain/release的次数可能更少,因为它经常知道retain/release对何时相互抵消,retain/release更快,因为它不会不要调用 Objective-C 方法调用(在 Objective-C 中,您可以覆盖保留/释放;使用 ARC 则不能)。