weak unowned

弱引用

class Person {
    var name: String
    var car: Car?
    init(name: String) {
        self.name = name
    }
}

class Car {
    var carName: String
    weak var user: Person?
    
    init(carName: String) {
        self.carName = carName
    }
}
let a = Person(name: "person")
let b = Car(carName: "car")
a.car = b
//此时不会循环引用 因为user是weak
b.user = a

无主引用

class Person {
    var name: String
    var car: Car?
    
    init(name: String) {
        self.name = name
    }
}

class Car {
    var carName: String
    unowned var user: Person
    init(carName: String, user: Person) {
        self.carName = carName
        self.user = user
    }
}
let a = Person(name: "person")
 //此时不会循环引用 因为user是unowned
a.car = Car(carName: "car", user: a)

当导致循环引用的属性是可选的,使用weak,非可选时使用unowned
在可选时也是可以使用unowned的,但必须保证属性总会引用到一个合法对象或 nil

在闭包中使用

    var a = "abc"
    lazy var someClosure: () -> String = {
        [unowned self] in
        return self.a + "123"
    } 

在闭包和捕获的实例self总是互相引用并且总是同时释放时,因此使用无主引用。
相反,在被捕获的引用可能会变为 nil 时,则使用弱引用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容