Cannot read property '_resetAssemblerData' of null

哪位大佬遇到过这个问题
09-04 00:04:54.348 8157-8213/org.cocos2d.kuaiyou E/jswrapper: ERROR: Uncaught TypeError: Cannot read property ‘_resetAssemblerData’ of null, location: src/cocos2d-jsb.js:0:0
STACK:
[0]onDestroy@src/cocos2d-jsb.js:12846
[1]anonymous@src/cocos2d-jsb.js:24600
[2]destroyComp@src/cocos2d-jsb.js:21582
[3]_onPreDestroy@src/cocos2d-jsb.js:12524
[4]161.prototype._destroyImmediate@src/cocos2d-jsb.js:25879
[5]_onPreDestroy@src/cocos2d-jsb.js:41739
[6]_onPreDestroy@src/cocos2d-jsb.js:7712
[7]161.prototype._destroyImmediate@src/cocos2d-jsb.js:25879
[8]_onPreDestroy@src/cocos2d-jsb.js:41736
[9]_onPreDestroy@src/cocos2d-jsb.js:7712
[10]161.prototype._destroyImmediate@src/cocos2d-jsb.js:25879
[11]_onPreDestroy@src/cocos2d-jsb.js:41736
[12]_onPreDestroy@src/cocos2d-jsb.js:7712
[13]161.prototype._destroyImmediate@src/cocos2d-jsb.js:25879
[14]_onPreDestroy@src/cocos2d-jsb.js:41736
[15]_onPreDestroy@src/cocos2d-jsb.js:7712
[16]161.prototype._destroyImmediate@src/cocos2d-jsb.js:25879
[17]deferredDestroy@src/cocos2d-jsb.js:25783
[18]runSceneImmediate@src/cocos2d-jsb.js:6605
[19]anonymous@sr
[ERROR] (C:/CocosCreator/resources/cocos2d-x/cocos/scripting/js-bindings/jswrapper/v8/Object.cpp, 521): Invoking function (0xcf34ddc0) failed!
09-04 00:04:54.362 8157-8213/org.cocos2d.kuaiyou D/jswrapper: JS: LoadScene 89z3e4RaBM8LCt+C9qNzmF: 17509.091ms
09-04 00:04:54.363 8157-8213/org.cocos2d.kuaiyou D/jswrapper: JS: InitScene: 0.024000000004889444ms
JS: AttachPersist: 0.03999999999359716ms
JS: AutoRelease: 0.046000000002095476ms
JS: [ERROR]: object already destroyed
09-04 00:04:54.364 8157-8213/org.cocos2d.kuaiyou I/chatty: uid=10213(u0_a213) GLThread 375 identical 6 lines
09-04 00:04:54.364 8157-8213/org.cocos2d.kuaiyou D/jswrapper: JS: [ERROR]: object already destroyed

我也遇到了,不知道为什么,我是把1.9的工程升级到2.0就遇到了,在网页没事,安卓上关闭一个node就会出现。

查了一天。查到了cocos2d-jsb里面
我们是写了一个自定义控件继承cc.Label,在这个控件没被激活的情况下,如果destroy这个node就会报错。
_assembler 在onDestroy的时候,没有值,而它在web版本没有问题,android有问题。
_assembler的赋值是在label的parent节点
RenderComponent ctor函数有这样一句

this._assembler = this.constructor._assembler;

它在android执行应该是 this._assembler = null or undefined的
我怀疑是js engine的不同导致的。
我就重载了一下onDestroy的函数,如下,暂时解决问题。
onDestroy: function() {
if (this._assembler == undefined) {
this._assembler = {}
}
this._super();
},

时间紧任务重,没有继续追查,希望有开发人员出来解释一下

ios上有发现这情况,h5和模拟器都没问题,真机就报错了。水平不够,一直没有查找原因。看来是使用了i18n导致的了

麻烦提供一个可以重现这个 bug 的 demo 吧,目前推测不出具体原因呢。:slightly_smiling:

如果遇到了相同的 bug,请在第一时间 @ 我们,如果条件允许请附上一个 demo,我们会尽快检测如果确定是 bug 的话会尽快修复的。:slightly_smiling:

额,论坛有回复没收到消息。~有条件我弄个demo看看,具体我跟代码发现是这样的。解决方法也是重载了onDestroy函数

这个bug我也遇到了,貌似删除 自己写的继承与 cc的类的 组件的时候,就会出现

Creator2.10

var LabelExtended = cc.Class({
    extends: cc.Label,
    ctor(){
        this._assembler = cc.Label._assembler
    }
});

console.log("xxxxxxxxxxxxxxxx", cc.Label._assembler === LabelExtended._assembler)

我也遇到这个问题了。
更好的解决办法应该是像上面一样在ctor里面初始化对象的_assembler属性
出问题的点在下图CCRenderComponent.js 的 ctor函数里面,
this.constructor._assembler (LabelExtended._assembler)是空的
所以当你使用了继承的组件创建的节点时,对象的_assembler是空的,但是调用了cc.Label的setString过后,因为cc.Label里面有个updateAssembler函数,会重新赋值_assembler,所以也不会出问题。只有创建了一个节点,但是一直是not active, 那么销毁时才会出问题。

我是在微信平台出现这个问题,浏览器是ok的,假如cc.CCClass这个函数创建的类A继承自B,B有一个变量B._assembler

在浏览器A._assembler == B._assembler
在微信或你们使用的安卓平台 A._assembler是空的

为什么会出现上面的差异,@crazypad@jare 大神解答一下, 我上面的代码在不同平台就可以验证

其实我就是用你们的示例代码里面的LabelLocalized.js出的问题,试着把这个组件挂到一个节点上,但一直隐藏节点(active = false), 然后直接销毁就可以重现

关于 assembler 的问题,还是有些意思的,但是我没明白你想表达的意思,我试着按照你最后一句的描述做了个 demo,但是也没有发现报错啊。。。
你可以不用将你对 assembler 的理解描述的这么详细,毕竟。。。他不一定是对的。。。:grin:开玩笑啦
你可以将你的问题具体出来,不需要描述太多,只要问题本身就好。
我看到了有意思的问题,会尽快回复的

顺便一提我 引擎版本 是: 2.0.7

你是只测试了web吗?web是ok的
我稍后整个demo给你吧,我觉得我描述得很清晰了:cold_sweat:

我是测了 微信平台啊。。。。尴尬:sweat_smile:

我这边有重现的demo,你点击切换到下一个场景就会出问题了,
HelloLabel.zip (236.2 KB)

请看一下我的demo,直接在网页上就可以看到error了

我这边统一回复一下哦,这个问题最近被 cary 大大修复了,所以我这边一直没有复现你们说的内容,额建议去仓库拉取最新的代码或者使用最新发布的编辑器。
这个是修复 PR: https://github.com/cocos-creator/engine/pull/3769/files

好吧,有人提供demo我就不提供啦!能解释下原因么?因为这个问题是平台相关的,web是没问题的,另外我用2.1.0都有这个问题,你2.0.7是ok的?

我用的自定义引擎,关于这个问题的相关的修改内容应该会在最新的版本里有所体现,原因是因为未执行 onEnable 中的 _updateRenderData 事件, onDestroy 时调用了 _assembler 不存在属性,目前引擎已经规避了这个报错问题,你可以从我上方的链接中查看详情。