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
。