cocos2d-x 在CCSequence中使用CCCallFunc时的release BUG

来源:互联网 发布:部署ipv6网络 pdf 编辑:程序博客网 时间:2024/05/16 18:33

猴子原创, 欢迎转载,转载请在明显处注明! 谢谢。

原文地址:http://blog.csdn.net/yanghuiliu/article/details/6951984


项目中以前一直有个BUG,就是就我使用完CCSequence后,在析构里面release掉的时候总会BUG,之前没时间弄,直接注释了。

今天重新又遇到这个问题,在一哥们的帮助下,找到了原因。但是好的解决方暂时没有。

描述下问题,

view plain
  1. mAction= CCSequence::actions(action,  
  2.       CCCallFunc::actionWithTarget(this,callfunc_selector(MyClass::callBackAction)),NULL);  
  3. mAction->retain();  

代码某处我创建了一个队列action,当action执行完毕后会回调callBackAction函数。功能很简单。


但是当我在析构里面mAction->release();时就出错了,纠结半天才知道,当我runAction(mAction)结束后,CCCallFunc会autoRelease掉。那么在析构的时候,我执行mAction->release();时,当初创建的CCCallFunc会被再次release,但是这个CCCallFunc在前面已经被autoRelease了。这个时候就会报错。


不过呢,CCSequence里面放的都是action时,就不会出这个问题,但action和CCCallFunc都是继承同一个基类,为什么这个会出问题?还不是很清楚。


也许你还会想到析构的时候使用CC_SAFE_RELEASE(),你能想到这很不错,但是也不能解决上面的问题。

先看看它是实现

view plain
  1. #define CC_SAFE_RELEASE(p)  if(p) { p->release(); }  

现在知道了吧,他只是判断了传进去的对象是否为空。


OK,就这样吧,记录一笔,午休时间Over,工作中....