retain和release倒底怎么玩?
呼呼,好久没有发布教程了(小若:难得清静了,你为毛又出来吓人==),其实最近木头我在准备出版书籍的事情。但是貌似不太顺利,果然我还是积累不够,写书的过程压力好大,感觉写不出有趣的文字出来(小若:嗷、、、)。果然还是在博客写自由一些?嘿嘿~
最近以及最不是很近(小若:书里一定不能出现这些错误的语句,所以你才写不出来吧==),不少朋友对retain的认识似乎有点模糊,今天我就和大家分享一下关于retain的知识吧~
笨木头花心贡献,啥?花心?不呢,是用心~
@H_403_54@转载请注明,原文地址:http://www.jb51.cc/article/p-zlltzegt-zw.html
正文:
1.为什么会有retain?
C++和Java不一样,Java有一套很方便的垃圾回收机制,当我们不需要使用某个对象时,给它赋予null值即可。而C++new了一个对象之后,不使用的时候通常需要delete掉。
于是,Cocos2d-x就发明了一套内存管理机制(小若:发你妹纸。。。),其实红孩儿的博客很详细地解释了Cocos2d-x的内存管理机制,我没有能力也不想重复解释。(小若:那你还写?==)
Retain的意思是保持引用,也就是说,如果想保持某个对象的引用,避免它被Cocos2d-x释放,那就要调用对象的retain函数。(小若:为什么不retain就会被释放?)
2.真正的凶手autoRelease
既然旁白诚心诚意地问我,那我就光明正大地回答吧(小若:我今天没力气吐槽,好吧==)。
一旦调用对象的autoRelease函数,那么这个对象就被Cocos2d-x的内存管理机制给盯上了,如果这个对象没人认领,那就等着被释放吧。(小若:==太久没吐槽,一时不知道吐什么好)。
3.看代码实际点
说了这么多,还是上代码吧。
创建一个Cocox2d-x的项目,就直接拿HelloWorldScene开刀,修改init函数,在最后添加一句代码:
- boolHelloWorld::init()
- {
- boolbRet=false;
- do
- {
- /*很多代码被省略了。。。。。。*/
- testSprite=CCSprite::create("HelloWorld.png");
- bRet=true;
- }while(0);
- returnbRet;
- }
(小若:testSprite是什么东东?)
testSprite是一个成员变量,在头文件里加上就可以了: