妥善使用autorelease()方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了妥善使用autorelease()方法相关的知识,希望对你有一定的参考价值。

autorelease()并不是毫无代价的,其背后的垃圾池机制同样需要占用内存和CPU资源,每次执行autorelease()的过程,实际上对应的是执行成对的retain()和release(),以及一次成对的容器存取,还包括其他的逻辑判断。过多不必要的autorelease()将导致垃圾池臃肿。

 
此外,autorelease()只有在自动释放池被释放时才会进行一次释放操作,如果对象释放的次数超过了应有的次数,则这个错误在调用autorelease()时并不会被发现,只有当自动释放池被释放时(通常也就是游戏的每一帧结束时),游戏才会崩溃。在这种情况下,定位错误就变得十分困难了。例如,在游戏中,一个对象含有1个引用计数,但是却被调用了两次autorelease()。在第二次调用autorelease()时,游戏会继续执行这一帧,结束游戏时才会崩溃,很难及时找到出错的地点。
 
因此,我们建议在开发过程中应该避免滥用autorelease(),只在工厂方法等不得不用的情况下使用,尽量以release()来释放对象引用。

以上是关于妥善使用autorelease()方法的主要内容,如果未能解决你的问题,请参考以下文章

objective-c高级编程 笔记

为啥在 init 方法中为 iVar 定义调用 autorelease?

autorelease基本概念

10.7 上的 ARC 迁移工具给出错误:删除未使用的“自动释放”消息是不安全的

再次理解autorelease对象

2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)