Cocos2d-iphone, не вызывающий dealloc при замене сцены - PullRequest
4 голосов
/ 30 июня 2010

Это упрощенная версия проблемы, с которой я сталкиваюсь сейчас. Я сделал 2 пустых CCScene 1 & 2 и добавил CCLayer 1 & 2 на их соответствующую сцену. Я также добавил функцию касаний, чтобы переключаться со сцены 1 на сцену 2, используя замещающую сцену CCDirector.

Однако Deloc не вызывался во время замены сцены.

// 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. Это даже предположить, что происходит? Может кто-нибудь сказать мне, что я сделал неправильно, или это просто мое недоразумение, что retainCount должен быть равен 0, прежде чем вызывается dealloc?

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

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

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

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

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

0 голосов
/ 03 августа 2010

Кроме того, dealloc вызывается только изредка, как я обнаружил, поэтому его сложно проверить и вызвать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...