NSNotification & didReceiveMemoryWarning в iOS 6
Начиная с iOS 6.0, метод viewDidUnload устарел. До iOS 6 я использовал для удаления Observer NSNotification в методе viewDidUnload. Но так как он устарел, я переместил его в didReceiveMemoryWarning. Теперь, если мое приложение получает недостаточно памяти, уведомления удаляются. Так что мой код, написанный на NSNotification, не работает.
Кто-нибудь может сказать мне, как я могу решить эту проблему?
Заранее спасибо.
2 ответа
Я предполагаю, что вы добавили наблюдателя в viewDidLoad
, Проблема в том, что на iOS 6 представления не выгружаются даже в ситуации нехватки памяти. Поэтому, если вы удалите наблюдателя в didReceiveMemoryWarning
, viewDidLoad
больше не будет звонить
Есть две относительно простые альтернативы, которые вы можете выбрать:
- Добавить наблюдателя в
viewWillAppear
и удалите его вviewWillDisappear
, - Добавьте наблюдателя в свой
initXXX
метод и удалить его вdealloc
,
Я могу добавить наблюдателя в viewDidLoad
и удалите его в didReceiveMemoryWarning
, Но тогда вы должны "вручную выгрузить" представление в didReceiveMemoryWarning
, чтобы viewDidLoad
позже позвонил снова. См., Например, /questions/25106060/kak-vyigruzit-predstavlenie-i-vossozdat-ego-ispolzuya-raskadrovku-kogda-didreceivememorywarning/25106068#25106068 для примера кода, как принудительно выгрузить представление.
Проблема в том, что вы совершенно не понимаете, что viewDidUnload
средства. viewDidUnload
вызывается, когда представление выгружено. В предварительной iOS 6, когда вы закончили с контроллером представления, его представление НЕ выгружается. В pre-iOS 6 99% времени вы никогда не увидите viewDidUnload
выполняется, потому что представления обычно не выгружаются. В предшествующей iOS 6 представления выгружались только в ответ на предупреждение памяти, и представление не было видно. В iOS 6 единственным изменением является то, что представления никогда не выгружаются, даже в предупреждении памяти.
Поведение viewDidUnload
идентичен в pre-iOS 6 и iOS 6 - он вызывается при выгрузке представления. Из-за этого вам НЕ нужно менять код для iOS 6. Если вы это сделали, вы сделали что-то не так.
До iOS 6 я использовал для удаления Observer NSNotification в методе viewDidUnload.
Если вы имеете в виду, что вы добавили наблюдателя в viewDidLoad
тогда вы должны удалить его в dealloc
, В противном случае ваш код потерпит крах. Как я уже говорил выше, в 99% случаев в версиях, предшествующих iOS 6, представления не выгружаются. Типичный поток init
-> viewDidLoad
-> dealloc
, Вид не выгружается в середине.
Вы также можете удалить наблюдателя в viewDidUnload
, Это хорошая идея, потому что она возвращает его в состояние до загрузки представления. Тем не менее, это не является строго необходимым, потому что, когда представление загружается снова, viewDidLoad
будет вызван, и переписать любое состояние, которое было раньше, в любом случае.
Так что ответ таков: вам не нужно ничего менять в ответ на iOS 6. Что бы вы ни делали в viewDidLoad
должны быть отменены в обоих viewDidUnload
(необязательно) и dealloc
(требуется). Это относится как к iOS 6, так и к предыдущей iOS 6.