通常的解释是,考虑到对象的生命周期,您应该在unowned和weak之间进行选择,但有时您可能仍然怀疑应该实际使用哪一个,并且想知道unowned和weak哪一个更好。

众所周知,Swift利用良好的旧ARC(自动引用计数)来管理内存,因此,正如我们习惯使用Objective-C一样,我们必须通过明智地使用弱手动处理保留周期引用。

如果您不熟悉ARC,则只需要知道每个引用类型实例都将具有与之关联的引用计数(简单整数值),这将用于保持对象实例当前的次数计数由变量或常数引用。一旦该计数器达到零,就会释放实例,并且它们所拥有的内存和资源将再次可用。

每当两个实例以某种方式相互引用时,您就有一个保留周期(例如,两个类实例具有引用另一个类实例的属性,如同双链表中的两个相邻节点实例一样)会阻止这些实例被释放,因为保留计数总是大于零的值。

为了解决这个问题,在Swift中以及在许多其他语言中,引入了弱引用的概念,ARC不考虑这些引用,因此不会增加对象的保留计数。

考虑到弱引用不会阻止实例被释放,因此必须始终记住,弱引用在任何时候都不能再指向有效对象。

Swift有两种引用:unownedweak

虽然它们用于相同的目的,但它们与您的实例生命周期相关的假设略有不同,并且具有不同的性能特征。

在Objective-C中,遵循标准模式,您将在块外声明对该实例的弱引用,然后在块内声明对该实例的强引用,以便在块执行期间获取它。显然,检查引用是否仍然有效是必要的。

为了帮助处理保留周期,Swift引入了一个新的构造来简化并更明确地捕获闭包内的外部变量,即捕获列表。使用捕获列表,您可以在函数顶部声明将用于指定应在内部创建哪种引用的外部变量。

1.当您不使用捕获列表时,闭包将创建对外部作用域的值的强引用:

闭包内发生的修改将改变原始变量的值

2.使用捕获列表,创建一个在闭包范围内有效的新常量。

如果未指定捕获修饰符,则常量只是原始值的副本,适用于值类型和引用类型。

在上面的例子中,我们iCopy在调用之前声明函数iStrong,并且当声明函数初始化私有常量时。如您所见,当我们调用第二个函数时,我们仍然会打印原始值i1

3.指定具有引用类型的外部变量的名称之前weakunowned之前,此常量将被初始化为对原始值的弱引用,并且这种特定形式的捕获是我们用来中断保留周期的形式。

使用unowned时 永远不会为nil 使用weak时 则是可选值

所以 如果这些对象的生命周期互不相关,也就是说,你不能保证哪一 个对象存在的时间会比另一个⻓,那么弱引用就是唯一的选择。另一种情况下,如果你可以保证非强引用对象拥有和强引用对象同样或者更⻓的生命周期的话,unowned 引用通常会更方便一些。这是因为我们可以不需要处理可选值,而且变量将可以被
let 声明,而与之相对,弱引用必须被声明为可选的 var。同样的生命周期是很常⻅的,特别是当 两个物体拥有主从关系的时候。当主对象通过强引用控制子对象的生命周期,而且你可以确定 没有其他对象知道这个子对象的存在时,子对象对主对象的逆向引用就可以是 unowned 引用。

unowned 引用要比 weak 引用少一些性能损耗,因此访问一个 unowned 引用的属性或者调用 它上面的方法都会稍微快一些;不过,这个因素应该只在性能非常重要的代码路径上才需要被 考虑。

unowned 引用带来的不好的地方当然是如果你在生命周期的假设上犯了错,那么你的程序就将 崩溃。个人来说,我经常会在 unowned 也可以使用的情况下,还是去选择用 weak。weak 将强制我们在所有使用的地方都去检查引用是否依然有效。我们可能会时不时地对一些 代码进行重构,而这可能会导致我们之前对于对象生命周期的假设失效。看你对哪一方面更重视

swift unowned和weak的使用相关推荐

  1. Swift学习:自动引用计数

    swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用 ...

  2. 初探swift语言的学习笔记七(swift 的关健词)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/32133809 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  3. 如何使用Instruments诊断App(Swift版):起步

    2019独角兽企业重金招聘Python工程师标准>>> 本文由Mr_cyz(博客)翻译自raywenderlich,欢迎参与我们的翻译活动. 原文:Instruments Tutor ...

  4. Swift解决【闭包引起的循环强引用】

    循环强引用还会发生在当你将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了这个类实例时.这个闭包体中可能访问了实例的某个属性,例如self.someProperty,或者闭包中调用了实例的某个 ...

  5. 如何在'纯'Swift中创建弱协议引用(不带@objc)

    本文翻译自:How can I make a weak protocol reference in 'pure' Swift (without @objc) weak references don't ...

  6. 网易漫画Swift混编实践

    \ 本文为『移动前线』群在4月8日的分享总结整理而成,转载请注明来自『移动开发前线』公众号.\ 嘉宾介绍 \ 胡波,来自于网易杭州研究院,之前在网易杭研移动应用部参与网易公开课/网易看游戏/网易云阅读 ...

  7. Swift —— 指针

    Swift -- 指针 1.指针 2. 指针类型 3. 原始指针的使用 4. 泛型指针的使用 5. 指针读取macho中的属性名称 6. 内存绑定 7. 内存管理 8.循环引用 8.1 弱引用 8.2 ...

  8. 最详尽的 Swift 代码规范指南

    1. 代码格式 1.1 使用四个空格进行缩进. 1.2 每行最多160个字符,这样可以避免一行过长. (Xcode->Preferences->Text Editing->Page ...

  9. Swift引用计数器

    ARC概述 和4.2+版本的Xcode对OC的支持一样,Swift也是使用ARC来管理内存,文档是这么描述的: Swift uses Automatic Reference Counting(ARC) ...

  10. ios weak和unown_Unowned 还是 Weak?生命周期和性能对比

    作者:Umberto Raimondi, 原文链接 ,原文日期:2016-10-27 每当处理循环引用(retain cycles)时,需要考量对象生命周期来选择 unowned 或者 weak 标识 ...

最新文章

  1. 厉害!重庆参加马拉松赛人数7年翻10倍,今年区县马拉松赛事将大增
  2. centos redis 自动重启脚本
  3. SAP FSM 学习笔记(三) 在微信里发起SAP FSM客户预约
  4. 基于TCP协议的网络摄像头的设计与实现
  5. SpringMVC 单文件上传与多文件上传
  6. NSURLConnection-网络访问(同步异步)
  7. 编程基本功:即使是脚本,也尽量减少硬代码,都使用变量
  8. 【面试】5道JAVA笔试算法题
  9. 计算机的照相机功能,单反相机各个功能按键的作用,让你彻底熟悉相机-fn键设置...
  10. .NET 语音转文字 文字转语音
  11. 树莓派4B+Intel神经计算棒(Stick2)+YoloV5可行性考察报告
  12. 和老外聊天、发邮件常用英语缩写(超实用)
  13. 计算机芯片级维修包括哪些,计算机芯片级维修1
  14. 半监督异常检测(Anomaly Detection)的研究线
  15. 从一个故事开始讲递归
  16. 编程是门艺术_是编程艺术吗?
  17. 高通android usb otg,Android OTG支持USB读卡器
  18. 在微服务架构中管理技术债务
  19. linux下boost编译安装全过程脚本塈bzip2编译安装全过程脚本
  20. 鞍点计算 C语言 SDUT

热门文章

  1. Android 系统的分区和文件系统(一)--Android分区的大概框架
  2. Windows系统查看电脑系统信息(操作系统与版本、系统型号、处理器具体型号、BIOS版本、BIOS模式、主板信息等等)
  3. Ubuntu 老版本下载
  4. mysql localhost无法连接
  5. 关于2440嵌入式MPlayer播放器的移植方法
  6. python spss modeler 比较_非常值得收藏的 IBM SPSS Modeler 算法简介
  7. AidLearning0.87F3安装Python3.8
  8. python图片保存jpg、show变成bmp_python bmp转换为jpg 并删除原图的方法
  9. 用 python 来操作 docx(使用 docx 库操作 docx 格式文件)
  10. dismiss ios pop效果_动画切换效果之push、pop、present、dismiss