2012-06-29 20 views
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 

感谢您的帮助

回答

2

,以此来了解它为什么不工作,我建议:

  1. 添加一个断点(或(我们称之为方法A),你在哪里执行 [delegateCompleteLayer showLevelCompleteLayer];

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

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

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

编辑:

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

在我看来,这是一个内存管理问题的提示。看起来您的delegateCompleteLayer已成为垃圾,当您从Level1Layer致电showLevelCompleteLayer时。

你可以检查你的代码,并确保delegateCompleteLayer被正确保留,并且它的dealloc方法没有被提前调用(在那里放置一个断点或一个跟踪)。

你可以尝试的另一件事是启用僵尸检测。请阅读this知道如何去做。

编辑2:

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

 //in the init : 
    [delegate startGame]; 

delegate可能已没有被设定(在init方法),这样可以解释为什么这个调用是无效的。

更一般地,我建议你把的NSLog在所有的dealloc方法追踪:

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

,这样就可以检测到任何不可预见的释放;并在每次打电话给代表不起作用的代表之前:

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

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

希望它有帮助。

+0

谢谢塞尔吉奥,我编辑了一些图片我的文章,你可以看看吗?感谢您的帮助 – Paul

+0

感谢塞尔吉奥,这正是您所说的,我称它为“无”的代表,现在它可以工作。谢谢 – Paul