严重BUG:cocos creator1.6崩溃EditBox

你说的句柄我都知道,我03年就在搞Windows编程。
咱们尽量就事论事啦,哪有那么多如果,好多事如果重来,都不会是这样子的。
遇到问题,就想办法解决它,至于说你知道这个设计有问题,OK的,你心里知道就行,因为你喷再多,引擎已经成型这样,难道能推倒重来么?

上面你说不再崩溃,是因为你retain了,引用计数变3了,也就是正常情况下这个对象释放不了(等于内存泄露)。而在非正常情况下,这个retian刚好不会让野指针发生。
现在就是查一下这个对象到底什么地方会被release多一次。有没有检查脚本在做release这种事?

因为官方人员没有一眼就看出问题,说明这个代码块应该如你所说是正常的,导致提前销毁应该是其它问题导致。

你的代码中跟 setDelegate 相关的是怎么写的?

我的代码只监听了这个事件,没有对EditBox做任何其它操作,也没调用它的除了读写string以外的任何API,

监听 editingDidEnded 这部分代码发出来看下。

这里问题的根本原因是 js delegate 被释放了,也就是 Editbox 组件已经被 GC 了,之后才触发了 Editbox 的析构函数

编辑器里监听的,没有代码。回调就么简单:
onNameEditingDidEnded: function () {
if (this.labelName.string != mm.data.nickname) {
this.send_CLSaveAccountInfo();
mm.tips.show(‘昵称修改成功’);
}
},

我有四个地方用了这个EditBox,用法都一样,就是监视了这个事件。

好的,收到

你的意思是进入有 Editbox 的界面会闪退?还是从有 Editbox 的界面离开到其他界面会闪退?

我现在也不肯定,有时就玩一两小时都没有闪退,我有过暴力测试,就是连续打开和关闭有这个EditBox的界面,有时是不会出现的。不是必现,是偶现。

提交了个修复方案,应该可以解决你的问题

https://github.com/cocos-creator/cocos2d-x-lite/pull/768
https://github.com/cocos-creator/engine/pull/1914

nativeDelegate 那边的引用计数是没问题的,它的生命周期也正常,出问题的是它所引用的 JS 对象

这张图比较清楚,实线是强饮用,虚线是弱引用,由于 GC 的时候可能先 GC Editbox,然后再触发 C++ Editbox 的析构函数,使得 EditboxDelegate 在释放自己对 JS 对象的弱引用(JS::HeapJS::Value)时,Spidermonkey 发现 JS 对象地址不正常而崩溃。

解决方案其实就是在 Editbox 组件 onDestroy 的时候,强制解除这个弱引用,也就是 engine pr 中的 setDelegate(null),所以你一开始的想法是有道理的,只是使用错了对象。

2赞

完美组成无限循环∞

辛苦了,解决了就好,不过这个版本先不动了,我那样改虽然有内存泄漏,但不闪退,勉强可用。

应该我只替换一下CCEditBox.js就可以不闪退吧。

这个替换完需要在 engine 目录执行 gulp build

好的,不过我先选择在逻辑存调用this._sgNode.setDelegate(null);因为可以热更新解决问题,不用发新包。:joy:

1赞

1.6.1 editbox这边有个崩溃