0

我有一个“场景”类,它添加了几个图层。我想在游戏结束时从其中一层添加最后一层(以显示不同的分数)(因此该层将使用委托调用 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. 在执行的方法(我们称之为方法 A)中添加断点(或跟踪) [delegateCompleteLayer showLevelCompleteLayer];

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

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

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

编辑:

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

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

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

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

编辑2:

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

     //in the init :
     [delegate startGame];

delegate可能尚未设置(在init方法中),因此请解释为什么调用无效。

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

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

这样您就可以检测到任何不可预见的释放;以及在每次调用不起作用的委托之前:

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

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

希望能帮助到你。

于 2012-06-29T07:07:17.167 回答