加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift的unowned字段

发布时间:2020-12-14 07:01:55 所属栏目:百科 来源:网络整理
导读:unowned 简单的说就是防止循环引用,类似OC中的 unsafe_unretained字段。最常用的情况是在懒加载模式使用闭包的时候防止循环引用, 如果当前的实例直接或者间接地对这个闭包又有引用的话,就形成了一个 self - 闭包 - self 的循环引用。 举例 class Person {

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,没有被释放

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

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

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

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

[unownedself]in

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读