ARC之解决闭包引起的循环强引用


copy自:swift2.0官方教程中文版---极客学院版

1.产生闭包之间的循环强引用

直接代码和上图:

class HTMLElement {
	let name: String
	let text: String?
	lazy var asHTML: Void -> String = {
		if let text = self.text {
			return "<\(self.name)>\(text)</\(self.name)>"
		} else {
			return "<\(self.name) />"
		}
	}
	init(name: String, text: String? = nil) {
		self.name = name
		self.text = text
	}
	deinit {
		print("\(name) is being deinitialized")
	}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
print(paragraph!.asHTML())
// prints"hello, world"
注意: 上面的 paragraph 变量定义为 可选HTMLElement ,因此我们可以赋值 nil 给它来演示循环强引用。

图片一



2.解决 闭包之间的循环强引用


class HTMLElement {
	let name: String
	let text: String?
	lazy var asHTML: Void -> String = {
		[unowned self] in // 这里加上占有列表
		if let text = self.text {
			return "<\(self.name)>\(text)</\(self.name)>"
		} else {
			return "<\(self.name) />"
		}
	}
	init(name: String, text: String? = nil) {
		self.name = name
		self.text = text
	}
	deinit {
		print("\(name) is being deinitialized")
	}
}


闭包内的捕获定义:
1.无主引用,在闭包和捕获的实例总是互相引用时并且总是同时销毁时
2.弱引用,在被捕获的引用可能会变为 nil 时


定义捕获列表
捕获列表中的每一项都由一对元素组成,一个元素是 weak 或 unowned 关键字,另一个元素是类实例的引用(如 self )或初始化过的变量(如 delegate = self.delegate! )。这些项在方括号中用逗号分开。


如果闭包有参数列表和返回类型,把捕获列表放在它们前面:
lazy var someClosure: (Int, String) -> String = {
[unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
// closure body goes here
}
如果闭包没有指明参数列表或者返回类型,即它们会通过上下文推断,那么可以把捕获列表和关键字 in 放在闭包最开始的地方:
lazy var someClosure: Void -> String = {
[unowned self, weak delegate = self.delegate!] in
// closure body goes here
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值