在使用autorelease()可以达到与release()同样的效果,甚至还能避免release()的许多隐患的情况下,是不是应该完全用autorelease()代替release()呢?
实际上,autorelease()并不是没有代价的,其背后的垃圾回收池机制同样需要占用cpu和内存资源,每次autorelease()执行的过程,实际上对应的是执行成对的retain()和release(),以及一次成对的容器存取,还包括其他逻辑的判断。过多不必要的autorelease()将导致垃圾池臃肿膨胀,在存在大量内存操作的程序中会尤为严重地挤占本来就很紧张的系统资源。
此外,autorelease()只有在自动释放池被释放时才会进行一次释放操作,如果对象释放的次数超过了应有的次数,则这个错误在调用autorelease()时并不会被发现,只有当自动释放池被释放时(通常也就是游戏的每一帧结束时),游戏才会崩溃。例如,在游戏中,一个对象含有1个引用计数,但是却被调用了两次autorelease()。在第二次调用时,游戏会继续执行这一帧,当游戏结束这一帧时才会崩溃,很难找到出错的地方。
因此,建议在开发过程中应该避免滥用autorelease(),只有在工厂方法等不得不用的情况下使用,尽量以release()来释放对象引用。
原文链接:https://www.f2er.com/cocos2dx/345682.html