schedule里面有个陷阱:
如果你调用含target参数的shedule函数把一个回调函数callback交给scheduler管理,并且给它加了一个string类型的key,例如叫"key"。最后还设定了只运行一次,即repeat参数写0.
Director::getInstance()->getScheduler()->schedule(callback, sprite, 0.0f, 0, 1.0f, false, "key");
并且你的回调函数callback里面又注册了另一个回调函数callback2,并且用的还是那个key:"key"。
这样的话,在第一个回调函数调用的时候,实际上是scheduler为了生成的一个Timer调用update函数,这个update函数再调用triger函数,triger函数再调用你的callback。
你的callback运行的时候,给scheluler又注册了一个相同key的的回调函数callback2.
你的callback调用完,triger调用完,回到Timer的update函数,这个时候记住是第一个callback对应的Timer的update,由于你的callback已经调用了一次,而你一开始指定这个callback只调用一次,triger完之后update函数就会调用cancel函数去把你个callback对应的Timer清楚掉。这个时候就有问题,他清除的时候是看key来清楚的,由于callback2跟callback的key一样,所以这个时候它会把callback2也清了。
这样下来callback2虽然被注册成功,但是在清理callback的时候被清掉了。当然这不是我们想要的。
所以....schedule用起来 要谨慎= =,不然这些错误很难找啊。尽可能不要在callback里面加新的callback。但可以在callback里面unschedule这个callback对应的schedule,它里面有代码保证这里不会出问题。
网友评论