cocos2d 之autorelease\ratain\release的理解
前言: 对于一个返回对象指针的方法。你若不看文档不看内部代码,你无法知道返回的这个指针需不需要你来释放。同样的对于将一个指针作为参数给一个方法后,你为犹豫我能不能施放这个指针。因为你不知道这个方法内部会不会将你的指针施放。 于是有了谁拥有谁施放的施放管理思想。 使用了上述管理机制和思想后,有些特定情况。比如方法内新建一个对象,然后返回对象时,按照谁拥有谁施放。对象是在方法内部新建的,方法退出前不再拥有,所以要在方法退出前释放。但是又要在退出时返回该对象。先返回还是先释放都是不对的。。。 于是就有了autorelease。 1、release 和retain是配套的,释放管理是通过引用计数。 2、release和retain的使用的指导思想是,谁拥有谁施放。 void class IhaveObjHandler() void dispatchObjX(){ }示例中:需要释放管理的对象是 ObjX,他在位置1新建,在位置2被传入到IhaveObjHandler。 3、autoreleas是一个特殊的release,即延后释放。 对比上面的dispatchObjX方法ObjX* createObjX(){ }上面示例是一个产生新对象的方法。经常会用到,如果按照上述的释放管理思想,如位置3的注释写的那样。会在方法返回之前被释放。于是有了autorelease。 autorelease其实只是为obj设置一个标记,延后释放。在之后的某一时刻,对obj的autorelease标记做处理(即释放)。上面示例中autorelease不是立即减少obj引用计数,则方法可以安全return obj;。 4、autoRelease实现原理的小细节 当CCObject释放时,如果该对象仍在自动释放池中,则从池中删除自己。 同一个对象多次autorelease()的话,会被多次加入池中。池中对象存储结构是CCMutableArray,也就是vector. 5、 使用autorelease的好处 1、new出来的对象的释放问题解决了。符合谁拥有谁释放的原则。 2、可以避免频繁申请/释放内存 //ttun注:(没想出来,是什么意思) 6、其实autorelease并没有那么好用 转自:http://blog.sina.com.cn/s/blog_4057ab6201018y4y.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |