Как удалить ненужный контроллер представления? - PullRequest
1 голос
/ 28 апреля 2011

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

- (void) showFight: (NSNotification*) notification
    {
        if(self.window.rootViewController != self.fightViewController)
        {
            NSDictionary* dict = [notification userInfo];

                FightViewController *fightView = [[FightViewController alloc]
                                                  initWithNibName:@"FightViewController" bundle:nil];
                fightView.userId = _userId;

                self.fightViewController = fightView;
                [fightView release];
                [self.radarViewController.view removeFromSuperview];  // Doesn't work.

                self.window.rootViewController = self.fightViewController;
                [self.fightViewController showMonster:dict];

        }
    }

Я знаю, что мой контроллер вида не удаляется, потому что я слышу звуковые эффекты от него в фоновом режиме.

Я хочу полностью уничтожить контроллер представления, так как я хочу только один контроллер представления в памяти в любое время. Я планирую каждый раз создавать контроллер представления с нуля, как показано в коде выше. Я делаю это неправильно?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Проблема здесь заключается в том, что вы не выпускаете контроллер вида.Подумайте о том, что на самом деле происходит в вашем коде по адресу:

[self.radarViewController.view removeFromSuperview];

Вы удаляете представление из его суперпредставления.Контроллер представления все еще существует, и он контролирует то, что должно отображаться на виде, и в вашем случае, по-видимому, воспроизводит звук.

Проще говоря: контроллер представления - это объект.У него есть ребенок, вид.Это еще один объект.Вы удаляете представление из другого представления, но объект, управляющий удаленным представлением, все еще живет (и фактически, так же, как и объект представления).

Если вы хотите уничтожить весь контроллер представления, вызовите это после удаления представленияиз его суперпредставления:

[self.radarViewController release];

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

self.radarViewContoller = nil;

, который автоматически отключается для вас в синтезированном сеттере.

Когда контроллер представления освобождается, его счетчик ссылок вычитается на единицу.Если счетчик ссылок достигнет нуля, контроллер будет освобожден.

0 голосов
/ 28 апреля 2011

Пока я понимаю, что ваша проблема в том, чтобы добавить новый ViewController на сервер, уведомить и изменить текущее представление с новым View . Прежде всего, вы должны добавить контроллер представления, как показано ниже, потому что ссылка не поможет обновить представление.

[self.window.rootViewController.view addSubview: self.fightViewController.view]

По моему мнению, вам нужно пометить ваши контроллеры и проверить перед добавлением контроллера, что, если он уже существует в памяти, в противном случае пул объектов будет протекать. Просто скажи нет утечкам памяти !!

- (void) showFight: (NSNotification*) notification
{
      UIView *fightView = (UIView *)[self.window.rootViewController.view viewWithTag: FIGHT_VIEW_TAG];
      if (self.window.rootViewController.view.tag  != fightView.tag) {

          NSDictionary* dict = [notification userInfo];
          FightViewController *fightView = [[FightViewController alloc]
                                               initWithNibName:@"FightViewController" bundle:[NSBundle mainBundle]]; 

          //Remove the current view.
          [self.window.rootViewController.view removeFromSuperview];   // If you're adding the fighting View in the root View, then why are you trying to remove current view through radar controller which has already added in the window (root view). 

          fightView.userId = _userId;
          [fightView setTag: FIGHT_VIEW_TAG];
          [self.window.rootViewController.view addSubView: self.fightViewController.view]; 

          [self.fightViewController showMonster:dict];
          [fightView release];
  }
}

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

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