删除节点后报错(只在IOS出现)

  • Creator 版本:1.7.0

  • 目标平台: Web / iOS / Android /

  • 重现方式:

  • 出现概率:100%

file:src/jsb_polyfill.js
line;7725

_onPreDestroy: function() {
    this.unscheduleAllCallbacks();
    for (var t = this.__eventTargets, e = 0, i = t.length; e < i; ++e) {  // 这局报错
        var n = t[e];
        n && n.targetOff(this);
    }
    t.length = 0;
    0;
    cc.director._nodeActivator.destroyComp(this);
    this.node._removeComponent(this);
    0;
},

error:TypeError: null is not an object (evaluating ‘t.length’)

@panda @jare

真是无语了,web,Android都没问题,就IOS 有问题 !!!

看报错,应该是 this.__eventTargets 的问题~~

一个用prefab生成的弹窗,node.destroy(); 删除后就会报这个错。这个弹窗上面有 用prefab生成的列表,我发现如果我不生成列表,删除就不报错。

let node = cc.instantiate(prefab);
content.addChild( node ); // 这句注释就不报错

但是。。。有的prefab并没有生成过列表,也会报这个错误。。。

从报错来看 var t = this.__eventTargets, this.__eventTargets 拿到的应该是 null,所以后面 i = t.length 这里就报错了

for (var t = this.__eventTargets, e = 0, i = t.length; e < i; ++e)

应该是这句的问题吧,this.__eventTargets 拿到的不是 array

我现在就想知道,这种问题应该怎么破啊,客户那边还等着我发包呢。。。

关键是 Android,web 都没问题,头痛

我后面想自己加个判断算了,

var t = this.__eventTargets || [];

结果这里不报错了,其他地方又报错了。我在想这样判断下去是不是没玩没了,而且也没解决根本问题

@panda @jare @Q_Q ,麻烦引擎组的看下

__eventTargets 创建的位置:

https://github.com/cocos-creator/engine/blob/v1.7-release/cocos2d/core/components/CCComponent.js#L68

应该是所有 component 创建都会包含这个数组,按理说不会出现缺失的情况,你的描述又是只在 iOS 出现,挺奇怪的。

从不 addChild 不会出错来分析的话,addChild 本身会做的是 component 的加载和生效,比如 onLoad 调用,start 调用等,会不会是这个过程中 __eventTargets 出现问题了

应该是这个节点已经被销毁了。这个时候访问任何属性都是会报错的。你应该看看调用栈,什么情况下触发了 _onPreDestroy 呢?或者能提供一个 demo 吗?

我找到问题了!! 这个绝对是引擎的BUG

你说的没错,这个问题就是因为节点被销毁了,但是他的属性还被某个东西访问了。
label组件的string 上有个我写 的 setter,嗯,就是这个鬼,节点都被销毁了,引擎居然还设置了label.string 2次,web Android 上没有,但是 IOS 上就是有,泪奔…

@panda @jare @Q_Q

调用 node.destroy() 节点销毁 的时候,引擎就设置了 label.string,这个绝对不是我设置的。。。因为 web Android就没有这个问题

暂时用 cc.isValid 来避免这个问题,但是还是希望官网能解释一下这个问题

你定义了 label 的 setter,这种 hack 才会引起 bug 吧?如果你没 hack 引擎,引擎本身是没问题的吧?

对(怎么还有字数限制)