Если приведенные выше ответы не помогли, проверьте, использует ли ваш код KVO в классе, в котором вы получили эту ошибку.Когда KVO отправляет сообщение вашему классу наблюдения о значении изменения ключа, если класс был освобожден ARC, тогда KVO будет пытаться предупредить несуществующий адрес в памяти об этих изменениях, заставляя ваше приложение выбросить этоошибка.
Учтите, что это класс с именем MyViewController
, и вы хотите наблюдать, когда свойство bounds
его view.layer
меняется, указывая на изменение макета с альбомного на портретный.Таким образом, вы добавляете строку:
// self is MyViewController
self.view.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil)
Это предупредит ваш класс, если размер view
изменился.
Но если ваш viewController отклоняется, скажем, UINavigationController
выталкивает его из стека, KVO все еще собирается попытаться предупредить MyViewController
границы представления изменились (потому что теперь он исчез).Затем, когда KVO сделает это, ваше приложение будет аварийно завершено.В консоли отладки вы увидите следующее сообщение:
-[MyViewController retain]: message sent to deallocated instance
Это потому, что вы должны удалить наблюдателя (MyViewController
) для этого keyPath.Лучше сделать это до того, как MyViewController
будет отклонен, то есть так:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.view.layer.removeObserver(self, forKeyPath: "bounds")
}
Теперь, когда вы попытаетесь извлечь MyViewController
из стека навигации, ошибки не будет.