最近在查看引擎源码时,发现了下面一个问题,不知道是我研究不够深入还是引擎bug,在这里贴出来,大家一起讨论一下。我用的是2.0.4版本,发现问题后下载了2.2.4版本后,粗看了一下,问题好似还没解决!!
//CCNode可以设置节点自身的m_pScheduler
//默认是m_pScheduler = director->getScheduler();
void CCNode::setScheduler(CCScheduler* scheduler)
{
…
m_pScheduler = scheduler;
…
}
//创建新的定时器。绑定到节点自身的m_pScheduler
void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
{
…
m_pScheduler->scheduleSelector(selector, this, interval, !m_bIsRunning, repeat, delay);
…
}
//定时器过时后,引擎却使用CCDirector::sharedDirector()来回收。在没有调用节点的setScheduler方法时,下面代码没有问题。
//否则会造成CCTimer不能正常回收。
void CCTimer::update(float dt)
{
…
if (m_nTimesExecuted > m_nRepeat)
{ //unschedule timer
CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(m_pfnSelector, m_pTarget);
}
…
}
//建议修改为:(或者类似的做法)
void CCTimer::update(float dt)
{
…
if (m_nTimesExecuted > m_nRepeat)
{ //unschedule timer
(CCNode*)m_pTarget->unschedule(m_pfnSelector);
}
…
}
//笔者水平有限,有错误的地方可以指出来,大家一起讨论一下吧!