我有一个“ 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
感谢您的帮助
答案 0 :(得分:2)
作为一种发现它不起作用的方法,我建议:
在方法中添加一个断点(或跟踪)(让它称之为方法A)
[delegateCompleteLayer showLevelCompleteLayer];
如果被调用,请检查delegateCompleteLayer
值;
如果不是,请在应该调用方法A的方法中设置断点;
(重复,类似于2/3)。
编辑:
如果我理解正确,当你执行[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]);
检查您是否正在调用正确的对象。
希望它有所帮助。