gpt4 book ai didi

ios - 在 deinit 中清除强引用是否是正确的模式?

转载 作者:行者123 更新时间:2023-11-28 12:13:14 24 4
gpt4 key购买 nike

有几个资源( blogSO question ,而且我已经看到它无处不在)建议从 deinitNotificationCenter 中删除观察者UIViewController,例如:

deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

现在根据another blog entry我不必关心从 NotificationCenter 中删除观察者,因为它使用 weak 引用,我已经看到与其他引用一起使用的相同模式。

困扰我的问题。据官方documentation :

A deinitializer is called immediately before a class instance is deallocated. You write deinitializers with the deinit keyword, similar to how initializers are written with the init keyword. Deinitializers are only available on class types.

这是否意味着如果仍然存在对该类的强引用,deinit 将不会被调用,从而导致 deinit 引用清理无用?如果 NotificationCenter 仍然有对 viewController 的强引用,那么 viewControllerdeinit 永远不会得到叫对吧?因此,删除 deinit 中的强引用永远不会真正起作用。

我是不是漏掉了什么?

最佳答案

这个声明

[...] that recommend removing an observer from the NotificationCenter in the deinit of the UIViewController [...]

过去是真的。

还有你的声明

[...] if there still is a strong reference to the class, deinit will not get called.

是正确的。

观察者有弱引用

观察者持有对目标对象的弱引用

这解释了为什么即使有多个活跃的观察者,对象的 deinit 也会被调用。

那么为什么我们要在 deinit 中移除观察者呢?

在 iOS 9 之前需要这样做,以防止观察者调用已释放对象的方法。

然而,从 macOS 10.11 和 iOS 9.0 开始不再需要注销观察者

In OS X 10.11 and iOS 9.0 NSNotificationCenter and NSDistributedNotificationCenter will no longer send notifications to registered observers that may be deallocated.

Source

关于ios - 在 deinit 中清除强引用是否是正确的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com