cocos2d-x之retain和release

1.关于cocos2d-x中的内存管理机制,有很多关于这方面的资料,本不想提起,但笔者这段时间练的一个消灭星星的游戏实现却遇到了相关的问题,简单介绍一下。用于管理点击遍历搜索后的星星对象的vector在取出对象后遇到了问题,取出的行列值出现了混乱,百思不得其解,后来发现这时候取出的sprite对象其实已经被销毁了,所以在加入vector时retain后解决了问题,但其实问题却不在于此。

2.具体原因其实也很简单,消灭星星对象时必须先清空表示星星数组中的标志位,然后才能removechild,否则自然找不到对象了,直接上代码。很明显是相当不合理,只要把第一句放到最后就好了。现在看来确实简单,不过当时查错的过程还是很麻烦的,一直没有注意到这一点。当然了体会自己发现问题,解决问题的过程是很享受的,特别是最后解决后的成就感。扯远了,总之一点点的进步,就能慢慢养成好的习惯,

cocos2d-x之retain和release_第1张图片

3.还有一点,cocos2d-x中Vector也封装了对于对象的 retain 操作和 release 操作,因此对对象的生命周期有了很大影响,这也是大多数人所忽略的的地方,可以在源码中找到解释。

cocos2d-x之retain和release_第2张图片
cocos2d-x之retain和release_第3张图片

4.由此可见,这里的vector已经同c++中不同了,作了进一步的封装,push_back会自动间接调用retain,而最后调用clear清除数组导致引用减少,自然导致了对象销毁。

5.因此笔者专门查阅了相关引用计数相关的资料,其实sprite在创建之初就autorelease 过了,就会被内存管理机制盯上了,可以在源码处找到证明。

cocos2d-x之retain和release_第4张图片

6.继承自 Cocos2d-x 的Object的子类都具有内存管理的一套方法,当需要继续持有对象时,就要及时调用retain增加引用计数,避免对象被销毁程序崩溃的尴尬。当然对于不需要的对象调用release减少计数。值得一提的是,调用addchild具有retain同样的效果,在对象被人认领之后当然就不会被销毁了,显而易见,其原理无非就是间接调用了retain。

7.总而言之,当遇到程序意外崩溃,中断后发现内存中对象数据很不正常的时候多半是对象被销毁了。此时注意调用retain的时机,保证对象在运行需要的期间正常存在,就能解决此类问题。

你可能感兴趣的:(cocos2d-x)