Swift的unowned字段

 unowned 简单的说就是防止循环引用,类似OC中的unsafe_unretained字段。最常用的情况是在懒加载模式使用闭包的时候防止循环引用,如果当前的实例直接或者间接地对这个闭包又有引用的话,就形成了一个 self -> 闭包 -> self 的循环引用。

举例

class Person {  

let name: String  

lazy var printName: ()->() = {  

print("The name is \(self.name)")  

}

init(personName: String) {  

name = personName  

}  

deinit {  

print("Person deinit \(self.name)")  

}}

var xiaoMing: Person? = Person(personName: "XiaoMing")

xiaoMing!.printName()

xiaoMing = nil//

输出:// 

The name is XiaoMing,没有被释放

printName 是 self 的属性,会被 self 持有,而它本身又在闭包内持有 self

这导致了xiaoMing 的 deinit 在自身超过作用域后还是没有被调用,也就是没有被释放。

为了解决这种闭包内的循环引用,我们需要在闭包开始的时候添加一个标注,

来表示这个闭包内的某些要素应该以何种特定的方式来使用。可以将 printName 修改为这样:

lazy var printName: ()->() = {  

[unowned self] in

print("The name is \(self.name)")  

}

swift还有一种防止对象持有的解决方法是把需要释放的对象用weak修饰, weak 的成员将会自动地变成 nil (因此被标记为 @weak 的变量一定需要是 Optional 值)

关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值