Где удалить наблюдателя для NSNotification в Swift?
где я должен удалить наблюдателя NSNotification
в Swift, так как viewDidUnload
и dealloc()
недоступны?
6 ответов
использовать ниже метод, который функционирует так же, как dealloc
.
deinit {
// Release all resources
// perform the deinitialization
}
деинициализатор вызывается непосредственно перед освобождением экземпляра класса. Вы пишете deinitializers с ключевым словом deinit, подобно тому, как intializers пишутся с ключевым словом init. Деинитиализаторы доступны только для типов классов.
по состоянию на iOS 9 (и OS X 10.11), вы Не нужно удалять наблюдателей себя, если вы не используете наблюдателей на основе блоков.
система сделает это за вас, так как она использует обнуление-слабые ссылки для наблюдателей, где это возможно.
больше информации можно найти на примечания к выпуску Foundation для OS X v10.11 и iOS 9.
если наблюдатель может быть сохранен как обнуление-слабая ссылка базовое хранилище сохранит наблюдателя как слабую ссылку на обнуление, в качестве альтернативы, если объект не может быть сохранен слабо (т. е. у него есть пользовательский механизм сохранения/освобождения, который предотвратит возможность среды выполнения хранить объект слабо), он сохранит объект как не слабую ссылку на обнуление. Это означает,что наблюдатели не обязаны отменять регистрацию в своем методе освобождения.
вы можете использовать три метода:
1 - после popViewController
, обратно navigationController
или dismissViewControllerAnimated
:
deinit {
print("Remove NotificationCenter Deinit")
NSNotificationCenter.defaultCenter().removeObserver(self)
}
или
2 - viewDidDisappear
, удалить после того, как это уже следующий контроллер вида:
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
или
3 - viewWillDisappear
- перед открытием следующего вида:
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
синтаксис Swift 3.0:
NotificationCenter.default.removeObserver(self)
Я также хочу отметить, что вы должны использовать этот метод:
func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
вместо
func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol
последний не удалит наблюдателя (недавно столкнулся с этой проблемой). Первый удалит наблюдателя, если вы используете iOS9.
также хорошо, если вы добавите своего наблюдателя в viewWillAppear()
и удалить их в viewWillDisappear()