Swift中[无主的自我]和[弱的自我]之间的区别

在Twitter上关注我: @ kiranjasvanee

在开始深入研究无主且虚弱的事物之前,让我们先谈谈关于ARC的一些知识。

当然,许多人都知道ARC(自动引用计数),当您创建任何类的实例时,它都会分配一块内存来存储有关该实例的信息。 当对象的引用计数等于0时,它将释放内存,因此其他对象可以使用同一内存。

那么,任何对象的引用计数如何变为0? 当没有任何变量指向该对象的引用(内存地址)时,这很简单。 关于保持对象引用的变量数量是该对象的引用计数。

好吧,这是一个基本概念,可以了解有关ARC的更多信息-Swift.org语言指南ARC

无主与弱

简单来说,“无主”和“弱”的工作方式相同,可以解决内存管理的保留周期问题。 两者都不会牢牢抓住它所引用的实例,在门后面都不会增加被引用对象的保留计数。 要了解有关保留周期的更多信息,请浏览相同的文档-Swift.org语言指南ARC。

那么,有什么区别呢?

无主引用不能为零,弱引用可以为零。

听起来很酷,但是实时有什么不同呢?

让我们通过示例来理解这一点。

从这里下载演示项目,如果您只是想了解这个概念,可以不用演示项目就可以继续。

演示中的内容-我们有两个控制器,一个是ViewController ,第二个是UnownedVsWeakViewController 。 可以通过URLSession调用从UnownedVsWeakViewController服务器下载图像。

我从ViewController -> UnownedVsWeakViewController ,然后立即导航(弹出)以了解在UnownedVsWeakViewController已经弹出时,在某些情况下,如[unowned self] UnownedVsWeakViewController [unowned self][weak self] ,闭包是如何反应的。

推送到UnownedVsWeakViewController并立即弹出,断点激活后检查调试内存图。

UnownedVsWeakViewController中仍然存在UnownedVsWeakViewController ,而您已经从UnownedVsWeakViewController弹出了。 这只是一个闭包调用,如果有很多闭包完成,您将最终将控制器保存在内存中。 错误的编码方案。

2.让我们尝试通过[weak self]实现这一目标

推送到UnownedVsWeakViewController并立即将UnownedVsWeakViewController弹出,一旦激活断点,检查调试内存图。

UnownedVsWeakViewController中不存在UnownedVsWeakViewController ,当您从中弹出时,它会立即释放。

注意: [weak self]无法阻止完成调用或在完成块内执行语句,只有在self不为nil时,它才会执行那些语句。

不要将自身包装在块中,如果自身为零,它会崩溃。

self !.imageView.image = UIImage.init(data: data!)

3.使用时间[unowned self]

这将崩溃。 unowned表示self不能为零。

让我们弄清楚它是如何崩溃的! 我们在UnownedVsWeakViewController调用了上述闭包,然后立即弹出控制器,因此将其释放。 现在,关闭完成是在下载映像后调用的,但是发现自己为nil,根据unowned身份,它不应该为nil,因此导致崩溃。 unowned不适合这里。 您也可以在认为适合您的代码的地方使用unowned