Swift 弱引用 (weak )与 无主引用 (unowned )的区别

释放双眼,带上耳机,听听看~!

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
}
}

人已赞赏
iOS文章

Swift 值引用与类型引用

2020-3-29 2:48:08

iOS文章

Swift 静态配发和动态配发

2020-3-29 4:04:16

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索