如果我将“删除”称为引用计数大于0的CCLayer对象,会发生什么

时间:2013-09-26 10:41:57

标签: c++ ios cocos2d-x

我为我的游戏使用了一个场景和多个图层。

当用户转到另一个游戏画面时,我从场景中删除当前图层,删除当前图层,设置当前图层= NULL,然后创建一个新图层,将其添加到场景

void UIManager::openScreen(int screenId){
   m_currentScreen = screenId;
   CCLayer *newLayer;
   if(screenId == MENU_SCREEN){
      newLayer = new MenuLayer();
   }else{
      ...
   }

   if(m_currentLayer != NULL){
      m_scene->removeChild(m_currentLayer, true);
      delete m_currentLayer;
      m_currentLayer = NULL;
   }

   m_scene->addChild(newLayer);
   m_currentLayer = newLayer;
}

在某些图层上,我使用回调调用了一些CCHttpRequest:

setResponseCallback(CCObject* pTarget, SEL_CallFuncND pSelector)

我用“this”传递给“pTarget”,这意味着这个回调的第一个参数是我的图层,它定义了一个SEL_CallFuncND选择器。

问题是当用户在屏幕(图层)之间切换到快速,但是一些缓慢的CCHttpRequest仍然没有完成,并且在UIManager删除图层然后我的游戏崩溃之后将调用响应回调:(。我不想锁定屏幕并强制使用等待http请求完成。用户应该可以中止加载屏幕并切换到他们想要的下一个屏幕。

  1. 我应该调用“delete m_currentLayer”而不是m_currentLayer-> release()吗? 据我所知,release会减少引用计数,我只是想确保“noone”使用m_currentLayer而不是m_scene所以我使用了“delete”。但我不确定这是否正确。

  2. 如果我在这种情况下使用发布功能,我担心代码中的某些地方会使用图层并增加图层的保留计数,这是否会造成泄漏内存问题?

  3. 如果m_currentLayer-> retainCount()= 4并且我调用“delete m_currentLayer”,那么m_currentLayer会发生什么?

  4. 我对这些问题感到困惑,请有人给我一个建议。 非常感谢你!

1 个答案:

答案 0 :(得分:0)

  1. 您不应手动删除节点。它可能会导致一堆错误。参考
    计算约定是在需要确定对象仍然存在时调用retain并在不需要此对象时调用release

  2. 仅在对象内部使用retainrelease,这确实需要其他对象存在。在任何其他情况下,您可以在使用之前使用assign属性(不保留对象并检查它不是NULL)。如果某个对象(让我们称之为a),那不是你的(例如CCNode),则保留另一个对象(让我们称之为b),手动删除b可能会导致错误的访问错误,因为a将确保b仍然存在。并可以调用b->doSmth()

  3. 之类的内容
  4. 您的m_currentLayer将被删除,但可能会导致错误,因为保留计数4意味着4个对象可能导致错误的访问错误。