知识卡片
循环强引用与weak打破所有权倒置
内容
当A持有对B的强引用、B又持有对A的强引用时,即使外部所有变量都不再指向A或B,两者的引用计数也永远大于0,谁都不会被释放——这就是循环强引用,一种[[ARC用引用计数取代垃圾回收]]场景下特有的内存泄漏。解法是识别关系里谁是”拥有者”、谁是”被拥有者”:拥有者对被拥有者用默认的强引用,被拥有者对拥有者的反向引用改用weak——弱引用不增加引用计数,且当它指向的实例被释放时会自动变成nil(因此弱引用必须声明成var加可空类型,两者都是能被置nil的前提)。判断标准很直观:一个人拥有资产,资产不拥有人,所以Person到Asset是强引用,Asset到owner应该是弱引用——箭头方向反过来想,哪边是”逻辑上的所有权”,强引用就该点向哪边。
参考来源
《Swift编程权威指南》第24章《内存管理和ARC》