Подтвердить что ты не робот

IOS6 viewDidUnload Устарела

Возможно, это плохая практика, но из документации, которую я прочитал, я получил совет инициализировать объекты в некоторых случаях внутри метода viewDidLoad и ноль в viewDidUnload.

Например, если у вас есть что-то вроде добавления Observer

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(filterready:)
                                                 name:@"filterReady"
                                               object:nil];

Теперь у меня нет способа удалить Observer, однако viewDidLoad вызывается каждый раз, когда отображается представление, что приводит к тому, что несколько наблюдателей работают через некоторое время, а селектор вызывается несколько раз.

Я могу исправить это, переместив некоторые очистители в метод viewDidDisappear, но теперь у меня есть некоторые сомнения, если я поступаю правильно.

В моем примере у меня есть несколько контроллеров навигации, которые контролируют свои поднавигации, но dealloc никогда не вызывается для них, даже если на них не ссылаются

4b9b3361

Ответ 1

Вы должны использовать - (void)didReceiveMemoryWarning а также - (void)dealloc.

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

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

Ответ 2

Прежде всего, даже если viewDidUnload не устарел, вам необходимо было отменить регистрацию этого уведомления в viewDidUnload И dealloc. Даже до iOS 6, viewDidUnload НЕ вызывается в большинстве случаев; только в ситуациях с низкой памятью. Поэтому, если бы вы только поместили его в viewDidUnload, а не dealloc раньше, он не был бы незарегистрирован, и, вероятно, он был бы разбит, когда он был освобожден и получил уведомление. Поэтому вам, должно быть, пришлось поместить его в dealloc раньше, чтобы он работал правильно.

Во-вторых, если вы делали это правильно раньше, вам не нужно делать ничего лишнего для правильной работы в iOS 6. Единственное отличие в iOS 6 заключается в том, что представления больше не выгружаются вообще (даже в низкой памяти ситуации). Так что это так же, как в iOS 5, когда вы не столкнулись с ситуацией с низкой памятью. Поскольку представления не выгружаются, viewDidLoad будет вызываться только один раз, поэтому ваше уведомление будет регистрироваться только один раз. Он будет незарегистрирован в dealloc, поскольку вы должны положить его для того, чтобы он работал правильно.

Ответ 3

Алекс отвечает хорошо. Но мне нравится правильное спаривание. По этой причине, если представление не нужно уведомлять, когда оно даже не видно, я обычно добавляю уведомление в viewWillAppear и viewDidDisappear

Ответ 4

Почему бы просто не удалить наблюдателя в функции DEALLOC? И если вы используете ARC, не вызывайте [super dealloc]

Если вы рассматриваете функцию контроллера dealloc, вызов не вызван, вам нужно выяснить, почему это происходит. Возможно, у вас есть NSTimer, запущенный на ViewController, и когда вы открываете представление, это приведет к тому, что dealloc не будет вызван. Или вид сохраняется еще где.