iOS UIViewController, почему "self" становится "диким указателем" в viewDidUnload?

Мой фрагмент кода:

- (void)viewDidUnload{
    [super viewDidUnload];
    self.statusView = nil;
    self.tableView = nil;
    self.noDataView = nil;
}

В редкой ситуации мое приложение зависало в очереди self.noDataView = nil;, Когда я отлаживаю po selfказалось, что он указывает на что-то иное, чем текущий контроллер. Какова возможная причина?

PS:self.tableView"s delegate а также dataSource установлен в self в init метод. Это имеет какое-либо отношение к этому?

2 ответа

Решение

Первый, [super viewDidUnload] следует использовать в качестве последнего утверждения. Однако, это не исправит вашу ошибку, вероятно.

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

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

От Apple:

В iOS 6 методы viewWillUnload и viewDidUnload UIViewController теперь устарели. Если вы использовали эти методы для выпуска данных, используйте вместо этого метод didReceiveMemoryWarning. Вы также можете использовать этот метод для освобождения ссылок на представление контроллера представления, если оно не используется. Вы должны проверить, что представление не в окне, прежде чем сделать это.

И цитата WWDC 2012:

Метод viewWillUnload и viewDidUnload. Мы больше не будем их называть. Я имею в виду, что есть своего рода уравнение и анализ затрат, которые мы прошли. В первые дни нам требовалась реальная производительность, чтобы гарантировать, что при предупреждениях памяти мы выгружаем просмотры. Существовали всевозможные графические и вспомогательные магазины и так далее, которые также могли бы быть выгружены. Теперь мы выгружаем их независимо от представления, так что для нас не так уж важно для тех, кого нужно выгружать, и было так много ошибок, в которые могли бы попасть указатели.

Изменить: для вашей проблемы в iOS 5.1, viewDidUnload используется для освобождения всего, что вы сделали при создании представления, поэтому, если вы не создаете или не сохраняете объекты в viewDidLoad или ваш nibвы не можете выпустить их в viewDidUnload,

Другие вопросы по тегам