2015-12-31 4 views
0

Функция контроллера deinit контроллера моего вида вызывается каждый раз, когда я получаю NSNotification и выполняю соответствующий селектор !!! Вот код моего взгляда контроллера:Выполнение селектора после получения NSNotification вызывает дефиницию моего контроллера просмотра

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "initModels", name: "xyz.notification", object: nil) 
} 

func initModels(){ 
    print("Received notification to init models") 
} 

deinit { 
    print("De-init view controller") 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Каждый контроллер вид получает уведомление, он выполняет «initModels» нормально, но потом «Deinit» прямо называется! Вот что получить напечатанный на консоли:

Received notification to init models 
De-init view controller 

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

+0

Возможно, существует веская причина, по которой ваш vc освобождается (например, локальная переменная, которая ссылается на неё) произойти сразу после отправки уведомления ...? –

+0

Кроме того, хорошая практика заключается в том, чтобы ваши обработчики уведомлений принимали один параметр типа NSNotification (но я не уверен, что является следствием вашей подписи). –

ответ

0

OH MY! По какой-то причине я не знаю, когда имя селектора начинается с «init», это вызывает функцию функции deinit контроллера вида!

Вот имена функций Я пробовал:

  • initModels >> вызовы Deinit
  • init_models >> вызовы Deinit
  • initmodels >> работает нормально
  • initializeModels >> работает нормально
+0

Измените свой оператор печати, чтобы вывести ячейку памяти объекта, вызывающего метод. Мне интересно, если вызов метода 'init *' вызывает деинициализацию исходного объекта? Если это реплицируется в классе, как показано на рисунке, это может быть ошибкой. – Palpatim

Смежные вопросы