0

ゲームには 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 リクエストが完了するまで強制的に使用する ユーザーは、画面の読み込みを中止して、必要な次の画面に切り替えることができます。

  1. では、m_currentLayer->release() の代わりに「delete m_currentLayer」を呼び出す必要がありますか? 私が知っているように、リリースは参照カウントを減らします。「誰も」m_sceneではなくm_currentLayerを使用するようにしたいので、「削除」を使用しました。しかし、それが正しい方法かどうかはわかりません。

  2. この場合にリリース関数を使用すると、コードの一部の場所でレイヤーが使用され、レイヤーの保持カウントが増加するのではないかと心配しています。これにより、メモリ リークの問題が発生する可能性がありますか?

  3. m_currentLayer->retainCount() = 4 で、「m_currentLayer の削除」を呼び出した場合、m_currentLayer はどうなりますか?

これらの問題で混乱しています。誰かアドバイスをください。どうもありがとうございました!

4

1 に答える 1

0
  1. ノードを手動で削除しないでください。大量のエラーが発生する可能性があります。参照
    カウントの規則はretain、オブジェクトがまだ存在することを確認する必要があるときに呼び出しrelease、このオブジェクトが必要ないときに呼び出すことです。

  2. 本当に他のオブジェクトが存在する必要があるオブジェクト内でのみretain使用してください。releaseそれ以外の場合は、NULL何かを行う前にプロパティの割り当てを使用できます(オブジェクトを保持せず、そうでないことを確認してください)。あるオブジェクト ( と呼びましょうa)、つまり、あなたのもの (CCNodeと呼びましょう) が他のオブジェクト ( と呼びましょう) を保持している場合、手動bで削除すると、まだ存在することが確実になるbため、アクセスエラーが発生する可能性があります。そして、次のようなものを呼び出すことができますabb->doSmth()

  3. あなたm_currentLayerは削除されますが、保持カウント 4 は 4 つのオブジェクトが上記の不正なアクセス エラーを引き起こす可能性があることを意味するため、エラーが発生する可能性があります。

于 2013-09-26T12:36:44.627 に答える