Swift闭包与类在循环引用中,参数与捕获传入引用类型的简单案例理解
class TestView: UIView {
var handler: ((TestView) -> Void)?
func run() {
// 此处的self是作为参数传入,可认为传入的是一个局部变量。
// 引用在函数开始前创建,在函数结束时销毁。
handler?(self)
}
deinit { print("deinit") }
}
// 无循环引用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let view = TestView()
view.handler = { (someTestView) in
// 本例中这里的someTestView其实就是view,
// 但它是作为一个局部变量传入的,
// 在闭包运行时引用,结束时销毁,所以不会造成循环引用
print(someTestView)
}
view.run()
// 运行到这里时,view作为viewDidLoad方法内的局部变量,
// 方法结束view的引用计数减1,
// 若没有循环引用应触发view的deinit方法。
// 打印“deinit”
}
}
// 循环引用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let view = TestView()
view.handler = { (someTestView) in
// 这里的view是以捕获的形式得到的,
// 在闭包创建时就引用,而且一直保持直至闭包被销毁
//(循环引用下互相引用无法销毁)
print(view)
}
view.run()
// 没有打印“deinit”
}
}