美文网首页
cocos2dx中schedule的陷阱

cocos2dx中schedule的陷阱

作者: doyoubi | 来源:发表于2014-08-29 21:02 被阅读1492次

    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,它里面有代码保证这里不会出问题。

    相关文章

      网友评论

          本文标题:cocos2dx中schedule的陷阱

          本文链接:https://www.haomeiwen.com/subject/husstttx.html