cocos2dx中schedule的陷阱

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容