美文网首页征服iOSSwift学习
Swift中的循环强引用--【使用弱引用解决】

Swift中的循环强引用--【使用弱引用解决】

作者: piggybear | 来源:发表于2017-03-14 16:22 被阅读958次

弱引用(weak)

声明属性或者变量时,在前面加上weak关键字表明这是一个弱引用,弱引用会被定义为可选类型变量,而不是常量,因为定义的类型可以被赋值为nil。

案例

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?
    deinit { print("Apartment \(unit) is being deinitialized") }
}

建立两个变量(john和unit4A)之间的强引用,并关联两个实例:

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john

两个关联在一起的实例的引用关系如下图所示:


Person 实例依然保持对Apartment实例的强引用,但是Apartment实例只持有对Person实例的弱引用。这意味着当你断开john变量所保持的强引用时,再也没有指向Person实例的强引用了:

由于再也没有指向Person实例的强引用,该实例会被销毁:

john = nil
// 打印 “John Appleseed is being deinitialized”

唯一剩下的指向Apartment实例的强引用来自于变量unit4A。如果你断开这个强引用,再也没有指向Apartment实例的强引用了:


由于再也没有指向Apartment实例的强引用,该实例也会被销毁:
unit4A = nil
// 打印 “Apartment 4A is being deinitialized”

上面的两段代码展示了变量johnunit4A在被赋值为nil后,Person实例和Apartment实例的析构函数都打印出“销毁”的信息。这证明了引用循环被打破了。

注意
在使用垃圾收集的系统里,弱指针有时用来实现简单的缓冲机制,因为没有强引用的对象只会在内存压力触发垃圾收集时才被销毁。但是在 ARC 中,一旦值的最后一个强引用被移除,就会被立即销毁,这导致弱引用并不适合上面的用途。

引自:http://www.piggybear.net/?p=675

相关文章

  • Swift循环引用的解决方案

    解决实例之间的循环强引用,Swift 提供了两种办法用来解决你在使用类的属性时所遇到的循环强引用问题:弱引用(we...

  • Swift之weak和unowned

    Swift 提供了两种方法解决你在使用类的属性而产生的强引用循环:弱引用( weak )和无主引用( unowne...

  • Swift进阶06:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime等 内存管理 - 强引用...

  • Swift进阶 05:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用与Runtime等。 内存管理-强引用 ...

  • iOS内存管理

    swift 中如何解决循环引用 解决类之间的循环引用 weak:弱引用, 必须为变量(var),可选类型(?),指...

  • Swift中的循环强引用--【使用弱引用解决】

    弱引用(weak) 声明属性或者变量时,在前面加上weak关键字表明这是一个弱引用,弱引用会被定义为可选类型变量,...

  • Swfit --- 解决实例之间的循环强引用

    Swift 提供了两种办法用来解决你在使用类的属性时所遇到的循环强引用问题:弱引用(weak reference)...

  • Swift-05:内存管理

    swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime是什么样子的呢? 内存管理 - 强引...

  • Swift--内存管理

    Swift内存管理概述 强引用循环 打破强引用循环 闭包中的强引用循环 Swift内存管理概述 Swift中的AR...

  • Swift 强引用的解决方案(unowned 、 weak 、

    Swift 提供了两种方法来解决使用类的属性时的循环强引用的问题,他们是 弱引用(weak reference)和...

网友评论

    本文标题:Swift中的循环强引用--【使用弱引用解决】

    本文链接:https://www.haomeiwen.com/subject/bxjhnttx.html