在使用惰性初始化程序时,是否有保留周期的机会?
在博客文章和许多其他地方[unowned self]都可以看到
[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”。
因此,似乎没有保留周期。据我所知,当一个块捕获自身时,以及当该块被自身强烈保留时,会有一个保留周期。这种情况似乎类似于保留周期,但实际上并非如此。
我尝试过这个[…]
lazy var personalizedGreeting: String = { return self.name }()
似乎没有保留周期
正确。
原因{}()是考虑立即应用封闭@noescape。它不会保留捕获的内容self。
{}()
@noescape
self
供参考:Joe Groff的推文。