2012-06-29 47 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