将强引用转换为对自身的弱引用

Posted

技术标签:

【中文标题】将强引用转换为对自身的弱引用【英文标题】:Converting a strong reference to weak reference to self 【发布时间】:2016-12-16 17:09:45 【问题描述】:

如何将其转换为对 self 的弱引用?

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.handleMessage(_:)), name: "NewMessage", object: nil)

NSNotificationCenter.defaultCenter().removeObserver(self, name: "NewMessage", object: nil)

另外,还有一个相关的问题——视图控制器何时真正被销毁?我假设当您在不同的视图中切换时,视图控制器仍然保持活力,对吧?即它们不会在 viewDidDisappear 上被销毁。

【问题讨论】:

ios 9 开始,通知中心持有对观察者的引用,例如***.com/questions/39663984/…。 好的,所以通知中心对 self 的引用永远不会成为视图控制器停留的原因,对吧? 正确。澄清一下,在 iOS 9 之前,它存储了对观察者的 assign 引用,因此它也没有将观察者保留在内存中。这是一个assign 引用意味着您必须在dealloc/deinit 中删除自己作为观察者的身份,否则当您的应用尝试在已释放的对象上调用选择器时会崩溃。 【参考方案1】:

这是 viewcontroller 中的函数,它实际上是从内存中脱离出来的,所以在这里你可以删除观察者

                deinit 
                    // you code

                

为了对 self 进行弱引用,您可以使用

                weak var this = self

【讨论】:

以上是关于将强引用转换为对自身的弱引用的主要内容,如果未能解决你的问题,请参考以下文章

Swift如何实现通用类型的弱引用数组(下)

理解Java中的弱引用

关于C#中的弱引用

Swift如何实现通用类型的弱引用数组(下)

从python中的弱引用代理获取常规引用

理解Java中的弱引用(Weak Reference)