2019-12-04
2019-12-04 本文已影响0人
红色小星
swift 闭包循环引用产生以及处理
class DMDemoViewController: UIViewController {
// 在Swift中,如果定义一个属性,那么这个属性必须初始化,否则就会报错,如果不想初始化,可以在后面加上?可选类型
var callBackBlock:(()->())?
override func viewDidLoad() {
super.viewDidLoad()
loadData {[weak self] in // [weak self] self 弱引用
// Swift中尽量不写self,但是闭包中必须写self,因为闭包主要用来保存一段代码,什么时候执行是不确定的,为了防止闭包执行时对象被释放,其必须知道其中的方法和属性属于谁,所以要用self对该对象进行强引用
// 1.闭包引用self
self?.view.backgroundColor = UIColor.green
print("更新UI")
}
// Do any additional setup after loading the view.
}
func loadData(callBackBlock:@escaping ()->()) {
print("执行耗时操作")
// 2.self 引用 闭包
self.callBackBlock = callBackBlock
callBackBlock()
}
deinit {
print(#file,#line,#function)
}
}