Jsb+gui的一个bug

下面代码中, 如果 this 不是Natvie Object,或者是null,则在退出程序时会crash在 ScriptingCore::cleanup()/JS_DestroyContext(_cx) 里。

var listView = ccui.ListView.create();
listView.addEventListenerListView(this.onItemSelected, );

大概看了一下,应该是JSStudioEventListenerWrapper::m_bNeedUnroot == true时,会出问题。

JSStudioEventListenerWrapper::~JSStudioEventListenerWrapper()
{
    if (m_bNeedUnroot)
    {
        JSObject *thisObj = JSVAL_TO_OBJECT(_jsThisObj);
        JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
        JS_RemoveObjectRoot(cx, &thisObj);
    }
}

void JSStudioEventListenerWrapper::setJSCallbackThis(jsval jsThisObj)
{
    JSCallbackWrapper::setJSCallbackThis(jsThisObj);

    JSObject *thisObj = JSVAL_TO_OBJECT(jsThisObj);
    js_proxy *p = jsb_get_js_proxy(thisObj);
    if (!p)
    {
        JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
        JS_AddObjectRoot(cx, &thisObj);
        m_bNeedUnroot = true;
    }
}

我不太了解js本身在怎么工作的,所以也不知道具体原因。

目前解决方法是只用native obj当做this。但是没法用匿名函数了。

您好,能否提供一下您的cocos版本呢?希望提供一些出现问题的具体信息。
感谢您对cocos引擎的支持。

win7 64位+cocos2d-x-3.0beta2

重现方法如下:

  1. 修改cocos2d-x-3.0beta2\samples\Javascript\Shared\tests\CocoStudioTest\GUITest\UIListViewTest\UIListViewTest.js,第51行
    //listView.addEventListenerListView(this.selectedItemEvent, this);
    listView.addEventListenerListView(function(sender, type) { cc.log(‘listViewEvent:’ + type); }, null);
  2. 运行TestJavascript,进入listview的测试界面
  3. 退出程序
  4. crash了

3.0遇到同样问题 求解决方案?

这个问题确实存在,我们会尽快找到问题原因

问题已解决,请参考这个PR: https://github.com/cocos2d/cocos2d-js/pull/349/files