2010-06-30 55 views
4

這是我現在面臨的問題的簡化版本。 我做了2個空CCScene 1 & 2並將CCLayer 1 & 2添加到它們各自的場景中。 我還添加了觸摸功能,使用CCDirector的替換場景從場景1切換到場景2。Cocos2d-iphone,在更換場景時不調用dealloc

但是,dealloc在替換場景中從未被調用過。

// scene & layer 2 are exactly the same as 1 
@implementation MainScene 

    -(void)dealloc { 
    NSLog(@"scene dealloc"); 
    [super dealloc]; 
    } 

    -(id)init { 
    self = [super init]; 
    if (self) { 
     layer = [[MainLayer alloc]init]; 
     [self addChild:layer]; 
     [layer release]; 
     NSLog(@"test: %i", [layer retainCount]); //1 
    } 

return self; 
} 

@implementation MainLayer 

-(void)dealloc { 
NSLog(@"layer dealloced"); 
[super dealloc]; 
} 

-(id)init { 
self = [super init]; 
if (self) { 
    self.isTouchEnabled = YES; 
      NSLog(@"test %i", [self retainCount]); //1 
} 
return self; 
} 

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"test %i", [self retainCount]); //2 --> ???? 
[[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]; 
} 

此外,當我觸摸屏幕時,NSLog報告圖層的剩餘量爲2。這甚至是假設發生?任何人都可能告訴我我做錯了什麼,或者它只是我誤解,在調用dealloc之前retainCount需要爲0?

這個問題正在導致我的主遊戲程序崩潰,只是通過各種場景/層之間切換靜態精靈(和一些小動作)一遍又一遍。

+0

提示:使用自動釋放和饒了自己很多麻煩與內存管理! – LearnCocos2D 2010-08-29 08:39:18

回答

2

我不太懂行有關的cocos2d的合同,但你不應該釋放SecSceneccTouchesBegan的Alloc在這條線:[[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]

我看不出有任何理由replaceScene不會保留,所以現在當SecScene應該有一個時,保留計數爲2。

更重要的是,如果您以類似的方式添加MainScene可以解釋爲什麼它的保留數比您想要的高一個,所以它永遠不會被釋放。

0

此外,的dealloc只得到很少叫我發現 - 因此它是很難測試,並得到它調用...

+1

在這種情況下,你很可能通過不匹配alloc/release來泄漏內存......這不是dealloc方法的錯誤,它是什麼,何時何地分配/保留/釋放導致dealloc不被調用 – LearnCocos2D 2010-08-29 08:38:33