使用 self 和 unown self 进行延迟初始化,

Bre*_*ung 1 closures initialization swift

我只是在类中使用延迟初始化来尝试属性,这是我的代码:

class Person {

    let firstName: String

    lazy var greeting: String = {

        return "Hello, my name is \(self.firstName)"        
    }()

    init(firstName: String){
        self.firstName = firstName
    }

    deinit {
        print("deinitialized")
    }
}


var Brendon: Person? = Person(firstName: "Brendon")
var greeting = Brendon!.greeting

Brendon = nil  //*deinitialized*
Run Code Online (Sandbox Code Playgroud)

我试图找出如果我没有放入[unowned self] in闭包,类会取消初始化,我期望它不会运行该deinit{}方法,因为会有一个保留周期,但事实证明它确实在事实去初始化。难道不应该有一个保留周期吗?

更新

我的大脑告诉我的是:由于闭包引用 self 并且类引用了闭包(因为它位于类的主体内部),因此如果我没有像我[unowned self]设置的那样放置Brendon = nil,则闭包是保持Brendon实例存活。因此,保留周期,我是对的吗?

mat*_*att 5

在此代码中:

lazy var greeting: String = {
    return "Hello, my name is \(self.firstName)"        
}()
Run Code Online (Sandbox Code Playgroud)

...没有保留的封闭。注意(). 与其他函数一样,这只是一个函数;它被调用,而不是被存储。greeting是一个字符串,而不是一个存储的闭包。