Swift 弱引用 (weak )与 无主引用 (unowned )的区别

1.先举一个循环引用的列子

class Example {
	var num = 10
	var method:(Int) -> Int = {
		(i:Int) in
			return 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 = 10
	lazy var method:(Int) -> Int = {
		[unowned self] (i:Int) in
			return self.num + i
	}
}

捕获列表出来可以设置 self,还可以单独声明引用类型的成员,比如:

class Example {
	var delegate:UITableViewDelegate?
	lazy var method:(Int) -> Void = {
		[weak delegate = self.delegate] (i: Int) in
		//操作delegate
	}
}

你可能感兴趣的:(Swift)