ゲームには 1 つのシーンと多くのレイヤーを使用しました。
ユーザーが別のゲーム画面に移動すると、現在のレイヤーをシーンから削除し、現在のレイヤーを削除し、現在のレイヤーを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 リクエストが完了するまで強制的に使用する ユーザーは、画面の読み込みを中止して、必要な次の画面に切り替えることができます。
では、m_currentLayer->release() の代わりに「delete m_currentLayer」を呼び出す必要がありますか? 私が知っているように、リリースは参照カウントを減らします。「誰も」m_sceneではなくm_currentLayerを使用するようにしたいので、「削除」を使用しました。しかし、それが正しい方法かどうかはわかりません。
この場合にリリース関数を使用すると、コードの一部の場所でレイヤーが使用され、レイヤーの保持カウントが増加するのではないかと心配しています。これにより、メモリ リークの問題が発生する可能性がありますか?
m_currentLayer->retainCount() = 4 で、「m_currentLayer の削除」を呼び出した場合、m_currentLayer はどうなりますか?
これらの問題で混乱しています。誰かアドバイスをください。どうもありがとうございました!