2010-06-30 3 views
4

Это упрощенная версия проблемы, с которой я сейчас сталкиваюсь. Я сделал 2 пустых CCScene 1 & 2 и добавил CCLayer 1 & 2 на их соответствующую сцену. Я также добавил функцию касаний для переключения с сцены 1 на сцену 2 с помощью замены CCDirector.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, когда я касаюсь экрана. Неужели это даже происходит? Может ли кто-нибудь, возможно, сказать мне, что я сделал неправильно или это просто мое недоразумение, что keepCount должно быть 0, прежде чем dealloc будет вызван?

Эта проблема приводит к сбою моей основной игровой программы, просто переключаясь между различными сценами/слоями с помощью только статических спрайтов (и некоторых незначительных действий) снова и снова.

+0

совет: использовать autorelease и избавить себя много проблем с управлением памятью! – LearnCocos2D

ответ

2

Я не слишком хорошо осведомлен о контракте cocos2d, но ты не должен освободить SecScene вы Alloc в ccTouchesBegan на этой линии: [[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]

Я не вижу никаких причин, почему replaceScene бы не сохранить, так что теперь SecScene имеет счетчик удержания в два, когда он должен иметь один.

Что еще более важно, если вы добавили MainScene таким же образом, чтобы объяснить, почему его показатель удержания выше, чем вы хотели бы, поэтому он никогда не будет освобожден.

0

Кроме того, dealloc получает только называют редко я нашел - так трудно проверить и получить его вызов ...

+1

в этом случае вы, скорее всего, будете пропускать память, не сопоставляя alloc/release ... это не ошибка метода dealloc, это то, что и когда вы выделяете/сохраняете/освобождаете, что заставляет dealloc не называться – LearnCocos2D

Смежные вопросы