建议您从NotificationCenter
的deinit
的UIViewController
的NotificationCenter
中删除观察者,这是几种资源(blog,SO question,以及我在所有地方都看到过的),例如:
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
现在,根据another blog entry,我不必担心从
weak
中删除观察者,因为它使用了deinit
引用,但我看到了与其他引用相同的模式。这个问题困扰着我。根据官方documentation:
在取消释放类实例之前,将调用反初始化程序。您使用deinit关键字编写反初始化器,类似于使用init关键字编写初始化器的方式。反初始化器仅适用于类类型。
这是否意味着如果仍然有对该类的强引用,就不会调用
deinit
,从而使viewController
引用清理无效。如果NotificationCenter
仍然强烈引用viewController
,那么deinit
的deinit
将永远不会被调用,对吗?因此,删除ojit_code中的强力后悔永远是行不通的。我在这里想念什么吗?
最佳答案
这个说法
[...]建议从UIViewController的deinit中的NotificationCenter中删除观察者[...]
过去是真的。
和你的陈述
[...]如果仍然有对该类的强引用,则不会调用deinit。
是正确的。
观察者的参考力很弱
观察者将weak reference
保留到目标对象。
这解释了为什么即使有多个 Activity 的观察者也将调用对象的deinit
。
那么,为什么要删除deinit中的观察者呢?
在iOS 9 之前需要使用,以防止观察者调用释放对象的方法。
但是从macOS 10.11和iOS 9.0不再需要注销观察者
在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能释放的已注册观察者发送通知。
Source
关于ios - 清理deinit中的强引用是否正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47741859/