知识卡片
闭包捕获列表化解循环引用
内容
[[闭包捕获变量脱离作用域仍有效|闭包会捕获]]它内部用到的引用类型实例,如果一个类的属性是 [[逃逸闭包与非逃逸闭包的权衡|闭包]]、闭包体内又用到了 self,就会形成闭包持有 self、self 通过属性持有闭包的双向强引用, 构成[[循环引用与弱引用无主引用的取舍|循环引用]]的另一种常见形态。解决方式是在闭包起始 大括号后用方括号写一份捕获列表,显式指定闭包对某个变量按 weak 或 unowned 方式捕获, 而不是默认的强引用。发散:这说明循环引用不只发生在”两个对象互相持有”这种直观场景,只要 一段代码块(闭包)被存成属性、又反过来引用了宿主对象,同样的强引用循环就会成立——闭包 在这里等价于一个隐式持有 self 的匿名对象。
参考来源
《Swift 4从零到精通iOS开发》第10章《内存管理与异常处理》