unowned
简单的说就是防止循环引用,类似OC中的unsafe_unretained字段。最常用的情况是在懒加载模式使用闭包的时候防止循环引用,如果当前的实例直接或者间接地对这个闭包又有引用的话,就形成了一个 self -> 闭包 -> self 的循环引用。
举例
class Person {
let name:Stringlazy varprintName()->() =print("The name is \(self.name)")}
init(personNameString)
name personName
}deinit"Person deinit }}
xiaoMingPerson? "XiaoMing")
xiaoMing!.()
xiaoMing nil//
输出:The name is XiaoMing,没有被释放
printName
是self
的属性,会被持有,而它本身又在闭包内持有
,
这导致了xiaoMing
的deinit
在自身超过作用域后还是没有被调用,也就是没有被释放。
为了解决这种闭包内的循环引用,我们需要在闭包开始的时候添加一个标注,
来表示这个闭包内的某些要素应该以何种特定的方式来使用。可以将修改为这样:
[unownedself]in
swift还有一种防止对象持有的解决方法是把需要释放的对象用weak修饰,weak
的成员将会自动地变成nil
(因此被标记为 @的变量一定需要是 Optional 值)
关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用unowned
,如果存在被释放的可能,那就选择用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。