Delegate方法不接收从Layer到Scene类的调用

时间:2012-06-29 06:51:46

标签: delegates cocos2d-iphone

我有一个“ Scene ”类,可以添加多个图层。我希望在游戏结束时添加最后一层(以显示不同的分数)来自其中一个层(因此该层将使用委托调用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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

作为一种发现它不起作用的方法,我建议:

  1. 在方法中添加一个断点(或跟踪)(让它称之为方法A) [delegateCompleteLayer showLevelCompleteLayer];

  2. 如果被调用,请检查delegateCompleteLayer值;

  3. 如果不是,请在应该调用方法A的方法中设置断点;

  4. (重复,类似于2/3)。

  5. 编辑:

    如果我理解正确,当你执行[delegateCompleteLayer showLevelCompleteLayer];时,不是跳转到那个方法,而是跳转到一个随机(或多或少)的内存地址。

    在我看来,这是对内存管理问题的暗示。当您从delegateCompleteLayer致电showLevelCompleteLayer时,您的Level1Layer似乎已成为垃圾。

    您可以检查代码并确保delegateCompleteLayer被正确保留,并且不会提前调用其dealloc方法(在其中放置断点或跟踪)。

    你可以尝试的另一件事是启用僵尸检测。请阅读this以了解如何操作。

    编辑2:

    关于您与代表的第二次尝试,我认为当您这样做时:

         //in the init :
         [delegate startGame];
    

    您的delegate可能尚未设置(在init方法中),因此可以解释调用无效的原因。

    更一般地说,我建议您在所有dealloc方法中放置NSLog跟踪:

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

    这样你就可以发现任何不可预见的释放;并且在每次调用不起作用的代表之前:

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

    检查您是否正在调用正确的对象。

    希望它有所帮助。