Где удалить наблюдателя для NSNotification в Swift?

где я должен удалить наблюдателя NSNotification в Swift, так как viewDidUnload и dealloc() недоступны?

6 ответов


использовать ниже метод, который функционирует так же, как dealloc.

deinit {
    // Release all resources
    // perform the deinitialization
}

деинициализатор вызывается непосредственно перед освобождением экземпляра класса. Вы пишете deinitializers с ключевым словом deinit, подобно тому, как intializers пишутся с ключевым словом init. Деинитиализаторы доступны только для типов классов.

Swift Deinitializer


по состоянию на 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)

Swift предоставляет метод deinit, который вызывается на экземплярах классов до их уничтожения.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html


Я также хочу отметить, что вы должны использовать этот метод:

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()