1.先举一个循环引用的列子
class Example {
var num = 10
var method:(Int) -> Int = {
(i:Int) in
return self.num + i
}
deinit {
print("Example被释放了")
}
}
method 是一个闭包类型的参数,在类的定义中被初始化为与类属性 num 进行加法的运算。
使用Example:
var example:Example? = Example()
example?.method(3)
example = nil
执行上面的代码,你会发现析构器 deinit 方法没有执行。Example 类对 method 闭包是强引用的,同时闭包中又通过self 属性“持有”类本身,这样产生了一个循环引用。
为了解决循环引用,Swift 引入了 weak 和 unowned 关键字。
weak 和 unowned 类似,不同点是 unowned 是永远有值的。weak可以声明可选型,很多时候我们不想声明一个可选型,可选型代表着风险,此时就可将属性声明成 unowned
上面的循环引用的解决方案:
class Example {
class Example {
var num = 10
lazy var method:(Int) -> Int = {
[unowned self] (i:Int) in
return self.num + i
}
}
捕获列表出来可以设置 self,还可以单独声明引用类型的成员,比如:
class Example {
var delegate:UITableViewDelegate?
lazy var method:(Int) -> Void = {
[weak delegate = self.delegate] (i: Int) in
//操作delegate
}
}
————————————————
版权声明:本文为优快云博主「HQ_iOS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_36487644/article/details/86687958