0

複数のレイヤーを追加する「シーン」クラスがあります。ゲームの最後に (さまざまなスコアを表示するために) レイヤーの 1 つから最後のレイヤーを追加したいと思います (したがって、このレイヤーはデリゲートを使用して Scene クラスを呼び出し、Scene クラスはこの新しいレイヤーを追加する必要があります。" LevelCompleteLayer")。

しかし、Scene クラスのメソッドは呼び出しを受けません。理由がわかりますか?他のデリゲート (レイヤー間) は正常に機能しますが、このデリゲート (レイヤーからシーンまで) は機能しません。

コードは次のとおりです。

//in Level1Scene.h :
@interface Level1Scene : CCScene <CompleteLayerDelegate>{

//in Level1Scene.mh :
@implementation Level1Scene
@synthesize levelComplete;

-(void)showLevelCompleteLayer {
    CCLOG(@"delegateCompleteLayer showLevelCompleteLayer!!!");//does not show up
    [self addChild:levelComplete z:5000];//is not added
}

-(id)init {
    if ((self = [super init])) {
        ScoreLayer *scoreLayer = [ScoreLayer node];
        layer = [[Level1Layer alloc] initWithBackgroundImage:background.backgroundImage];
        levelComplete = [[LevelComplete alloc] init];

        layer.delegate = scoreLayer;//works fine
        layer.delegateCompleteLayer = self; //does not respond
        scoreLayer.delegate = layer;//works fine
        //...
    }
    return self;
}



//in Level1Layer.m :
[delegateCompleteLayer showLevelCompleteLayer];

//in GameProtocols.h :
@protocol CompleteLayerDelegate
-(void)showLevelCompleteLayer;
@end

ご協力いただきありがとうございます

4

1 に答える 1

2

機能しない理由を発見する方法として、次のことをお勧めします。

  1. [delegateCompleteLayer showLevelCompleteLayer];?を実行するメソッド (メソッド A と呼びましょう) にブレークポイント (またはトレース) を追加します 。

  2. 呼び出された場合は、delegateCompleteLayer値を検査します。

  3. そうでない場合は、メソッド A を呼び出すメソッドにブレークポイントを設定します。

  4. (2/3 と同様に繰り返します)。

編集:

私の理解が正しければ、 を実行する[delegateCompleteLayer showLevelCompleteLayer];と、そのメソッドにジャンプする代わりに、ランダムな (多かれ少なかれ) メモリ アドレスにジャンプします。

これは、メモリ管理の問題のヒントのように思えます。からdelegateCompleteLayer呼び出した瞬間にゴミになったようです。showLevelCompleteLayerLevel1Layer

コードを調べて、delegateCompleteLayer が適切に保持されていること、およびその dealloc メソッドが早期に呼び出されていないことを確認できます (そこにブレークポイントまたはトレースを配置します)。

あなたが試すことができるもう一つのことは、ゾンビの検出を有効にすることです. これを読んで、その方法を知ってください。

編集2:

デリゲートとの 2 回目の試みについては、次のようになると思います。

     //in the init :
     [delegate startGame];

your delegate might have been not set yet (in the init method), so that explain why the call is void.

More generally, I suggest that you put NSLog traces in all of your dealloc methods:

NSLog(@"DEALLOCATING OBJECT %@", [self description]);

so that you can detect any unforeseen deallocation; and also before each call to a delegate that does not work:

NSLog(@"CALLING INTO DELEGATE %@", [YOUR_DELEGATE_HERE description]);

to check that your are calling the right object.

Hope it helps.

于 2012-06-29T07:07:17.167 に答える