【BUG】IOS v8的, setTimeOut 会一直循环执行

线上闪退问题严重,想模拟下各种情况,无意中发现这个问题。
在setTimeout设置1s回调中,写一个错误,比如空指针的使用。
比如
let app = null;
app.native = 123;

在ios上就会每隔一秒再执行一遍回调函数.
同样的代码,在网页上跑就是正常的只执行一次。
下面有对应的测试代码,工程和相关截图

网页执行正常,只跑了一遍

  • 测试工程:
    TestNewCocos.zip (911.5 KB)

  • 手机型号 iphoneXR

  • 出现概率:100%

不确定线上闪退中是不是有跟这个问题有关的,
但是之前修改过的很奇怪的游戏逻辑bug中,有几个诡异的确实最后都在setTimeOut这,当时没搞明白为什么,用别的方式规避了,并且这几个bug在网页和android上都是ok的。

顶啊顶

setTimeOut
这是js的api吧,你需要手动管理的····
建议使用 schedule

没太明白手动管理是怎么做那?try catch里面的东西吗

https://docs.cocos.com/creator/manual/zh/scripting/scheduler.html?h=计时器

你用这个吧

不行我试过了,
this.scheduleOnce(() => {
console.log(“11111111111111111111111111111111111”)
this.createNative();
}, 1);
在我上面那个测试工程里,把settimeOut换成scheduleOnce 依然会不停的循环调用这个回调那.
这可咋整。。。。。

不停的调用?
这是1秒后,调用一次的
确定是这?

是不是不可思议。。。。。但确实是这样的
只要在回调函数里用了这两行
let app = null;
app.native = 123;
这个回调就会每隔一秒调用一次
只有ios上会

试了试android也会

回调里clearTimeout一下可以规避一下。。。

let oldSetTimeout = setTimeout;
window[‘setTimeout’] = function (func, time, …args) {
let timeout = oldSetTimeout(function () {
console.log("~~~~ new clear ");
clearTimeout(timeout);
func.call(…args);
}, time);
return timeout;
}

游戏用了挺多 settimeout 也不知道会不会出问题。

肯定是逻辑出错了。

1赞