知识卡片
循环引用与弱引用无主引用的取舍
内容
当两个实例的属性互相强引用对方时,即使外部所有变量都已置空,两者的[[ARC引用计数原理|引用 计数]]也永远不会归零,内存无法释放,这就是循环引用。解决办法是让其中一个方向的引用不计入 引用计数:weak(弱引用)允许所引用的实例被释放,此时属性自动变为 nil,因此只能修饰 Optional类型;unowned(无主引用)则假定被引用的实例绝不会在自己存活期间被释放,一旦 假设不成立、实例已被释放后仍去访问,程序会直接崩溃。发散:两者的取舍本质是”用运行时崩溃 换取更少的判空代码”还是”用允许为空换取更高的容错性”——无主引用更贴近该关系天然不可能为空 的场景(如信用卡必然属于某个人),弱引用更适合关系本身就可能断开的场景。
参考来源
《Swift 4从零到精通iOS开发》第10章《内存管理与异常处理》