12月27日下午3点至5点Cocos2d-x作者王哲在线问答交流第五期~

王哲你好,我有个技术问题请教你:
cocosbuilder内存泄露,reader代码中存在互相引用导致内存无法释放

CCNode * CCBReader::readNodeGraph(CCNode * pParent) 中有这样的代码

// Set root node
if (! mActionManager->getRootNode())
{
mActionManager->setRootNode(node);
}
其中 mActionManager->setRootNode(node);
CCNode* CCBReader::readNodeGraphFromData(CCData pData, CCObject pOwner, const CCSize &parentSize)中有这样的代码
CCNode pNode = (CCNode
)pElement->getIntKey();
CCBAnimationManager* manager = (CCBAnimationManager*)animationManagers-

objectForKey((intptr_t)pNode);

pNode->setUserObject(manager);
其中 pNode->setUserObject(manager)
注意:
mActionManager->setRootNode(node);


pNode->setUserObject(manager)

node与pNode地址相同
mActionManager与manager地址相同
也就是说二者互相引用了。

结果导致二者都无法释放

以上是根据自带例子TestsCpp调试结果。虽然通过其他加载方式避开了这个问题,还请确认下是否存在这个问题,如果存在该如何解决呢?感谢

你好:3.0beta 这个月末发布吗? 我想问的问题是 3.0的内存管理方式与之前的2.X 有变化吗?
如果有变化都改动那些处理方式? 谢谢!

哈哈,月底发布不了啦!!延期到一月7号啦!!!

3.0-alpha1还比较稳定
3.0-beta因为改了renderer,我心里比较没底

removeFromParent也不行,不在回调函数中可以正常删除。创建后立马调用removexxx是可以的,但在cc.callfunc里调用就出现错误

Assertion failure: !cx->isExceptionPending(), at …/jscntxtinlines.h:330

— Begin quote from ____

引用第24楼zhijianming于2013-12-27 15:36发表的 回 18楼(wu-hao) 的帖子 :
removeFromParent也不行,不在回调函数中可以正常删除。创建后立马调用removexxx是可以的,但在cc.callfunc里调用就出现错误 http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865118

— End quote

感觉还是retain的问题,当他去执行callfunc的时候,C++对象可能已经被释放掉了

现在问题是在c++层,onTouchBegan会判断touch区域来返回true/false,而js层是没有这个判断的,且没法取的c++层的判断,还要在js层再做一遍同样的区域判断来返回true/false
可是这件事情,在html5里通过直接调用_super就可以了,可是jsb里是不能这样做的…

— Begin quote from ____

引用第14楼wu-hao于2013-12-27 15:16发表的 :

你好,listenner还没有JSB绑定,虽然现在新的touch事件是在c++层是eventlistenner机制,但是我们做到了行为一致,所以不用在意这个问题
http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865097

— End quote

具体是哪个函数?

— Begin quote from ____

引用第27楼faseer于2013-12-27 15:42发表的 :
现在问题是在c++层,onTouchBegan会判断touch区域来返回true/false,而js层是没有这个判断的,且没法取的c++层的判断,还要在js层再做一遍同样的区域判断来返回true/false
可是这件事情,在html5里通过直接调用_super就可以了,可是jsb里是不能这样做的…

http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865126

— End quote

可以发一下你具体的写法吗

var TestView = cc.TableView.extend({
    onTouchBegan:function (touch, event) {
        var ret = this._super(touch, event);
        if (ret){
            ....
        }
        return ret;
    }
    ....
}


```






*--- Begin quote from ____*

引用第29楼wu-hao于2013-12-27 15:48发表的  :


可以发一下你具体的写法吗
 http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865129
![](p_w_picpath/back.gif)



*--- End quote*

cctableview什么时候加上滚动条。。。:7:

另外不是说lua是最流行的语言吗。。js就放弃吧。。。据我了解现在网游的都是lua。。。为什么不整合出一个好的解决方案。。现在可是移动互联网的的时代,,谁还回去再做单机游戏(不作死就不会死),,那个quick cocos2dx 是基于github(要翻墙)上的。对于初学者来说不易入手。。。希望cocos团队能够重视脚本这块。

另外。对于3D引擎cocos团队有没有预想。。。。

王大大直接无视了我的无聊问题。。汗~~~

前阵子看到在讨论更换jsoncpp > rapidjson
不知道大概是哪个版本

— Begin quote from ____

引用第32楼佐耳云儿于2013-12-27 16:05发表的 :
王大大直接无视了我的无聊问题。。汗~~~ http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865141

— End quote

是啊,某些情况要更多参数(设计本意是用同个类的成员变量传递更多参数),某些情况要更少参数更简洁,我也为难。要不用默认形参的方式?

(Objcet×){ fun(XX1,XX2); }如果没有Objcet×参数的话,(){ fun(XX1,XX2); },这样难道还不简洁?同类参数直接(Objcet×){ fun(XX1,XX2); },这样还不简洁吗?

强转的方式难以让人信服。

— Begin quote from ____

引用第35楼佐耳云儿于2013-12-27 16:22发表的 回 34楼(walzer) 的帖子 :
(Objcet×){ fun(XX1,XX2); }如果没有Objcet×参数的话,(){ fun(XX1,XX2); },这样难道还不简洁?同类参数直接(Objcet×){ fun(XX1,XX2); },这样还不简洁吗? http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865154

— End quote

具体是哪个函数?能否说得更详细些?

— Begin quote from ____

引用第36楼佐耳云儿于2013-12-27 16:29发表的 回 34楼(walzer) 的帖子 :
强转的方式难以让人信服。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=175781&pid=865158

— End quote

哪里强转?

Objcet×参数只要使用就需要强转,我指的是回调,比如按钮的回调,如果需要使用到2个参数,我通常是这样做(Objcet×){ fun(XX1,XX2); },也就是Objcet×显得已经有些过时。