Swift关键知识点25-自动引用计数
00 分钟
2023-9-12
  • Swift使用Automatic Reference Counting(ARC)来追逐和管理应用的内存使用。ARC自动释放不再被使用的类实例的内存。
  • 示例
  • 类实例之间的强引用循环
notion image
notion image
notion image
  • 解决类实例之间的强引用循环:Swift提供了弱引用和无主引用两种方式来解决类实例之间的强引用循环。另一个实例的生命周期更短(另一个实例可以先被释放)时使用弱引用。当另一个实例的生命周期与当前实例相同或者更长时,使用无主引用。
  • 弱引用:变量前使用weak关键字。ARC会自动把弱引用属性或变量设置为nil当弱引用指向的实例被释放了。由于弱引用需要他们的值在运行时可以被设置为nil,因此它只能被声明为变量。你可以像检查option value一样检查弱引用变量是否有值。注意,当 ARC 将弱引用设置为 nil 时,不会调用属性观察器。
notion image
notion image
notion image
  • 无主引用:将unowned关键字声明时属性或者变量时写在前面。与弱引用不同的是,无主引用总是有值,ARC也不会把无主引用设置为nil。只有在你确信该引用始终指向一个未被释放的示例才使用无主引用。如果在无主引用的实例被释放后试图获取无主引用的值,会得到一个运行时错。误。
notion image
notion image
  • 上面的例子是一个使用安全的unowned references的例子。Swift也在你关闭了运行时安全检查时提供不安全的unowned引用方式以便提升性能。通过unowned(unsafe)关键字生命不安全的无主引用。当你在无主引用的实例被释放后访问该无主引用时,你的程序会尝试访问之前该实例所在的内存地址(不安全操作)。
  • Unowned Optional References:你可以把一个可选类引用标记为unowned。你可以同时使用unowned可选引用和弱引用。区别在于对于unowned可选引用,你需要保证它永远指向一个有效的对象或者被设置为nil。
notion image
  • 无主引用和隐式解包可选属性:弱引用解决了两个属性都可能被设置为nil的情况,无主引用解决了一个属性可能被设置为nil的情况。当两个属性都需要有值的情况下,需要组合使用无主引用和隐式解包可选属性。
  • 闭包的强引用循环:当你把一个闭包赋值给某个类实例的属性时,当这个闭包使用了实例的属性(如self.someProperty)或者闭包调用了实例的方法(如self.someMethod()),那么就有可能产生强引用循环。Swift提供了闭包捕获列表来解决这个问题。
notion image
  • 解决闭包的强引用循环-定义捕获列表:Swift要求在闭包中访问当前实例的属性和方法时不能省略self。

评论