cocos2d-x之retain和release

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

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

这里写图片描述

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

这里写图片描述
这里写图片描述

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

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

这里写图片描述

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值