严重BUG:cocos creator1.6崩溃EditBox

ios真机,苹果5S

这个崩溃,今天出现了四次。

尝试在onDestroy里setDelegate(null)失败setDelegate is not a function,但是
JS_DefineFunction(cx, proto, “setDelegate”, js_cocos2dx_CCEditBox_setDelegate, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);

好像找到崩溃的原因了。maybe is retain?

这个问题要紧急解决,现在发现存在的启动闪退,好像也是这个东西的原因,因为在登陆界面有EditBox,我们现在就有用户死活进不了登陆界面,之前发现的打开角色界面闪退也是这个原因。
而且这个也不是必现,有时闪退有时不闪,但是个很严重的BUG。
而且是在1.5.2里面就存在的。

明天会看一下这个问题

刚尝试紧急解决方案:
1.使用default自己修改这个release为retain,放弃了,因为长期使用binary接了不少sdk,改了不少配置,要切换到default,工程文件要改死我。
2.尝试不使用这四个事件:editingDidBegan,textChanged,editingDidEnded,editingReturn.没有太大把握能根除,也放弃了这个方案。

因为十万火急,改了default,终于编译过去了。整了三四小时。:sweat_smile:

最后是改了什么?

修改这个release为retain,在跑了,暂时还没有发生闪退,还要再测一下,代码没有深入看,只是猜的。

熬了一个通宵,这么厉害,不困么?

哈哈,其实中间睡了5小时+3小时,有8小时。一大早用户反馈,苹果6启动闪退,其它所有手机都没问题,手上没有苹果6,郁闷。

给先锋队长一个赞

刚又闪退了:joy:,这次都没调用栈。

1赞

官方人员不回复我,意思是这个是正常的?

将指针存在别处,然后release掉了。如果没有其它retain,这里肯定是野指针了。

麻烦耐心点,还没开始査,下午一定会给答复的

其实这个是正常的,错误不在这里,如果是这里的话,很容易就会出错的:我早上重了几次没重现,你那边可以必现吗?

就这个代码来说:

       // 创建:ref = 1
        JSB_EditBoxDelegate* nativeDelegate = new (std::nothrow) JSB_EditBoxDelegate();
        nativeDelegate->setJSDelegate(args.get(0));
        
        JS_SetProperty(cx, obj, "_delegate", args.get(0));
        
       // 设置对象,加引用:ref = 2
        cobj->setUserObject(nativeDelegate);
       // 弱引用,不用引用:ref = 2
        cobj->setDelegate(nativeDelegate);
       // 主动减:ref = 1
        nativeDelegate->release();

所以最后的引用计数是1的,具体你看看setUserObject的代码就知道了。

这里面存了nativeDelegate的指针,有两处存了指针,但引用计数是1,我没仔细研究它的引用计数,不想喷它的设计,只是能稳定就万岁,反正js层看不到这些东西。
如果我来设计,Ref会可以转为句柄,这里setDelegate一定不要传入指针,存句柄就好。这些宕机就不会存在。大部分宕机都一个原因,就是访问了已经销毁的对象。只要有办法来判断对象是否已经销毁,稳定性就能上一个台阶。而句柄就是用来干这个事的,windows已经用了十多年的技术。

这个也不是必现,因为这个对象如果引用计数还有1,都不知道什么时候销毁,而且可能跟GC的时机什么的有关,反正报的错就是访问了这个已经销毁的JSB_EditBoxDelegate,目前我改后,今天到现在没有再报这个崩溃的调用栈。