本文主要是介绍Swift 弱引用 (weak )与 无主引用 (unowned )的区别 [Debug],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.先举一个循环引用的列子
class Example {var num = 10var method:(Int) -> Int = {(i:Int) inreturn 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 = 10lazy var method:(Int) -> Int = {[unowned self] (i:Int) inreturn self.num + i}
}
捕获列表出来可以设置 self,还可以单独声明引用类型的成员,比如:
class Example {var delegate:UITableViewDelegate?lazy var method:(Int) -> Void = {[weak delegate = self.delegate] (i: Int) in//操作delegate}
}
————————————————
版权声明:本文为CSDN博主「HQ_iOS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36487644/article/details/86687958
这篇关于Swift 弱引用 (weak )与 无主引用 (unowned )的区别 [Debug]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!