Почему некоторые из моих контроллеров представления не получают предупреждение didReceiveMemory? - PullRequest
0 голосов
/ 30 ноября 2011

Контроллер корневого уровня в моем приложении для iPad - UISplitViewController. Таким образом, он имеет 2 контроллера вида:

  • один главный контроллер представления (элемент 0 свойства viewControllers)
  • один контроллер подробного представления (элемент 1 свойства viewControllers)

Контроллер подробного представления - это настраиваемый контроллер представления, который я меняю в зависимости от касаний и событий в моем главном контроллере представления.

Чтобы изменить этот подробный контроллер вида, я использую следующий код:

- (void)replaceSecondViewControllerBy:(UIViewController *)viewController {
    [[self.viewControllers objectAtIndex:1] dismissModalViewControllerAnimated:NO];
    NSArray *newVC = [NSArray arrayWithObjects:[self.viewControllers objectAtIndex:0], viewController, nil];
    self.viewControllers = newVC;
}

Моя проблема в том, что, когда мое приложение получает событие предупреждения о памяти, метод didReceiveMemoryWarning вызывается для всех моих контроллеров представления, за исключением для прежних контроллеров подробного представления. И они не освобождаются, потому что они все еще являются делегатами для других объектов (включая асинхронные методы, которые могут все еще выполняться).

Мои вопросы:

  • Каковы правила для UIViewController для получения didReceiveMemoryWarning сообщения? Почему мои прежние контроллеры детального представления не получают их?
  • Могу ли я безопасно вызвать didReceiveMemoryWarning или viewDidUnload на этих старых контроллерах вида?

1 Ответ

0 голосов
/ 30 ноября 2011

Похоже, что UIViewController подписывается на UIApplicationDidReceiveMemoryWarningNotification при его создании.Он удаляет наблюдение за уведомлением при его освобождении.Таким образом, didReceiveMemoryWarning вызывается, даже если представление контроллера не находится в иерархии представлений.Поэтому убедитесь, что ваши контроллеры не освобождены.

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

...