延迟初始化和保持循环 [英] Lazy initialisation and retain cycle
问题描述
在使用惰性初始化器时,是否有可能存在保留周期?
在博客文章和许多其他地方[无主的自己]
被看见
class Person {变量名:字符串懒惰 var 个性化Greeting:字符串 = {[无主的自己]在return "你好,(self.name)!"}()初始化(名称:字符串){self.name = 姓名}}
我试过了
class Person {变量名:字符串懒惰 var 个性化Greeting:字符串 = {//[无主的自己]在return "你好,(self.name)!"}()初始化(名称:字符串){打印(人初始化")self.name = 姓名}取消初始化{打印(人deinit")}}
就这么用了
//...让人 = 人(姓名:姓名")打印(person.personalizedGreeting)//..
并发现person deinit"已被记录.
所以似乎没有保留周期.据我所知,当一个块捕获 self 并且这个块被 self 强烈保留时,存在一个保留循环.这种情况看起来类似于保留循环,但实际上并非如此.
我试过这个 [...]
lazy var personalGreeting: String = { return self.name }()
<块引用>
似乎没有保留周期
正确.
原因是立即应用的闭包 {}()
被认为是 @noescape
.它不保留捕获的self
.
供参考:Joe Groff 的推文.
While using lazy initialisers, is there a chance of having retain cycles?
In a blog post and many other places [unowned self]
is seen
class Person {
var name: String
lazy var personalizedGreeting: String = {
[unowned self] in
return "Hello, (self.name)!"
}()
init(name: String) {
self.name = name
}
}
I tried this
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")
}
}
Used it like this
//...
let person = Person(name: "name")
print(person.personalizedGreeting)
//..
And found that "person deinit" was logged.
So it seems there are no retain cycles. As per my knowledge when a block captures self and when this block is strongly retained by self, there is a retain cycle. This case seems similar to a retain cycle but actually it is not.
I tried this [...]
lazy var personalizedGreeting: String = { return self.name }()
it seems there are no retain cycles
Correct.
The reason is that the immediately applied closure {}()
is considered @noescape
. It does not retain the captured self
.
For reference: Joe Groff's tweet.
这篇关于延迟初始化和保持循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!