Swift中的强引用和弱引用

67c*_*ies 45 reference weak-references objective-c swift

在Objective C中,您可以将属性定义为具有强引用或弱引用,如下所示:

@property(strong)...
@property(weak)...
Run Code Online (Sandbox Code Playgroud)

这怎么做得很快?

Kaa*_*glu 63

直接来自Swift语言指南:

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

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    weak var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下属性很强.但是看看"公寓"这个类的租户属性,它被宣称为弱者.您还可以使用unowned关键字,该关键字转换为Objective-C中的unsafe_unretained

https://itunes.apple.com/tr/book/swift-programming-language/id881256329?mt=11

  • `unowned`不会从Objective-C转换为`unsafe_unretained` (5认同)

Con*_*nor 12

默认情况下,var很强.您可以在var之前添加weak关键字以使其变弱.


Hon*_*ney 5

这是一个更重要的评论,但我无法适应。

如果你这样做

weak let name : SomeClass
Run Code Online (Sandbox Code Playgroud)

它将给出以下错误:

'weak' 必须是可变变量,因为它可能会在运行时改变

你必须做

weak var name : SomeClass
Run Code Online (Sandbox Code Playgroud)

'weak' 变量应该有可选类型 'SomeClass?'

所以你必须这样做:

weak var name : SomeClass?
Run Code Online (Sandbox Code Playgroud)

此外,在 Swift 中,所有弱引用都是非常量的 Optionals(想想 var 与 let),因为当不再有任何东西持有对它的强引用时,该引用可以并且将变为 nil。看这里

作为这种强制性可选化的结果,您总是需要解开它,以便您可以访问它的实际值。