您的位置:首页 > 移动开发 > Swift

Swift的unowned字段

2016-05-05 11:05 337 查看
 
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: