我为我的游戏使用了一个场景和多个图层。
当用户转到另一个游戏画面时,我从场景中删除当前图层,删除当前图层,设置当前图层= 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请求完成。用户应该可以中止加载屏幕并切换到他们想要的下一个屏幕。
我应该调用“delete m_currentLayer”而不是m_currentLayer-> release()吗? 据我所知,release会减少引用计数,我只是想确保“noone”使用m_currentLayer而不是m_scene所以我使用了“delete”。但我不确定这是否正确。
如果我在这种情况下使用发布功能,我担心代码中的某些地方会使用图层并增加图层的保留计数,这是否会造成泄漏内存问题?
如果m_currentLayer-> retainCount()= 4并且我调用“delete m_currentLayer”,那么m_currentLayer会发生什么?
我对这些问题感到困惑,请有人给我一个建议。 非常感谢你!
答案 0 :(得分:0)
您不应手动删除节点。它可能会导致一堆错误。参考
计算约定是在需要确定对象仍然存在时调用retain
并在不需要此对象时调用release
。
仅在对象内部使用retain
和release
,这确实需要其他对象存在。在任何其他情况下,您可以在使用之前使用assign属性(不保留对象并检查它不是NULL
)。如果某个对象(让我们称之为a
),那不是你的(例如CCNode
),则保留另一个对象(让我们称之为b
),手动删除b
可能会导致错误的访问错误,因为a
将确保b
仍然存在。并可以调用b->doSmth()
您的m_currentLayer
将被删除,但可能会导致错误,因为保留计数4意味着4个对象可能导致错误的访问错误。