UIViewController, сохраняющий объекты - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть кнопка на mainViewController, которая при нажатии открывает другой вид.

-(void)buttonTap:(id)sender
{
    GameViewController *gameViewController = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:[NSBundle mainBundle]];

    Level *level = [levels objectAtIndex:currentLevelNumber];
    gameViewController.level = level;

    UIView *gameview = gameViewController.view;
    gameview.frame = CGRectMake(0, 0, 480, 320);

    CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0);
    [gameview setTransform:rotate];

    gameview.center = CGPointMake(160, 240);

    [[self.view window] addSubview:gameview];
    [gameViewController release];
    gameViewController = nil;
}

В игре ViewController у меня есть еще одна кнопка, чтобы закрыть себя.

-(IBAction)buttonTap:(id)sender
{
    [self.view removeFromSuperview];
    //[self.view release];
}

У меня есть таймер в gameViewController, который все еще срабатывает даже после закрытия представления. ViewDidUnload или dealloc не запускаются вообще. Из-за этого игра со временем становится нестабильной. Когда и как этот gameviewcontroller освобождает все содержащиеся в нем объекты? Я искал по всему интернету, но не смог найти правильный ответ.

1 Ответ

0 голосов
/ 10 декабря 2010

Когда вы добавляете представление контроллера представления, определенные методы жизненного цикла на контроллере представления не вызываются.К ним относятся такие вещи как:

  • viewWillAppear:
  • viewDidAppear:
  • viewWillDisappear:
  • viewDidDisappear:
  • viewDidUnload может или не может быть вызван.Я считаю, что если вы когда-нибудь явно установите для свойства view значение nil.
  • Все методы, связанные с вращением

Вместо этого вы, вероятно, захотите представитьКонтроллер модального вида .Это формально добавляет его в иерархию контроллеров представления, помогает управлять вашей памятью и при необходимости вызывает все перечисленные выше методы.Если вы сделаете это таким образом, вы можете освободить контроллер представления сразу после вызова presentModalViewController:animated:, и он будет сохраняться до его отмены.

Если вы решите придерживаться своего текущего подхода (хотя я нене рекомендуется делать это), вам, вероятно, следует сделать следующее, когда gameview исчезнет с экрана:

gameViewController.view = nil;
[gameViewController release];
gameViewController = nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...