小编典典

延迟初始化并保留周期

swift

在使用惰性初始化程序时,是否有保留周期的机会?

博客文章和许多其他地方[unowned self]都可以看到

class Person {

    var name: String

    lazy var personalizedGreeting: String = {
        [unowned self] in
        return "Hello, \(self.name)!"
        }()

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

我试过了

class Person {

    var name: String

    lazy var personalizedGreeting: String = {
        //[unowned self] in
        return "Hello, \(self.name)!"
        }()

    init(name: String) {
        print("person init")
        self.name = name
    }

    deinit {
        print("person deinit")
    }
}

这样使用

//...
let person = Person(name: "name")
print(person.personalizedGreeting)
//..

并发现记录了“人deinit”。

因此,似乎没有保留周期。据我所知,当一个块捕获自身时,以及当该块被自身强烈保留时,会有一个保留周期。这种情况似乎类似于保留周期,但实际上并非如此。


阅读 245

收藏
2020-07-07

共1个答案

小编典典

我尝试过这个[…]

lazy var personalizedGreeting: String = { return self.name }()

似乎没有保留周期

正确。

原因{}()是考虑立即应用封闭@noescape。它不会保留捕获的内容self

供参考:Joe Groff的推文

2020-07-07