建议您从NotificationCenterdeinitUIViewControllerNotificationCenter中删除观察者,这是几种资源(blogSO 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,那么deinitdeinit将永远不会被调用,对吗?因此,删除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/

10-10 22:24