此文章延續(xù)上一篇(循環(huán)引用)進行說明的,有想了解的騷年請點擊 http://www.reibang.com/p/d248ecb00be7
class ViewController: UIViewController {
//創(chuàng)建一個屬性
var completionCallBack:(()->())?
override func viewDidLoad()
{
super.viewDidLoad()
//在block中如果出現(xiàn)self. 需要注意
//循環(huán)引用,單方向是不會產(chǎn)生引用的
//只是閉包對slef執(zhí)行了copy,閉包執(zhí)行完成后會自動銷毀,同時釋放對self的引用
//如果要循環(huán)應用,在閉包的同時用self引用
//解除循環(huán)應引用,需要打斷鏈條
// //方法一 : OC方式
// //為什么此處使用var,因為此對象可能在運行時被修改,如若使用let則報錯
// //weak只能修飾 var , 不能修飾 let
// //weak指向的對象一但被釋放,會自動設置成 nil ,而改變了指針地址
// weak var weakSelf = self
//
// LoadData {
//
// /*解包有兩種方式
// ' ? ' 為可選解包 - 如果 self 已經(jīng)被釋放,不會向對象發(fā)送 getter 消息,此方法更加安全
// ' ! ' 為強行解包 - 如果 self 已經(jīng)被釋放 , 強行解包會導致崩潰
//
// weakSelf?.view - 只是單純的發(fā)送消息,沒有計算
// 強行解包, 因為需要計算, 可選項不能直接參與到計算
// */
// print(weakSelf?.view)
// print(self.view)
// }
//方法二 : Swift 方法 (推薦方法) 同OC的__weak
// [weak self] 表示閉包中所有的self都是弱引用,需要注意解包
LoadData { [weak self] in
print(self?.view)
}
// //方法三 : Swift 另外一個方法 同OC的__unsafe_unretained
// //[unowned self] 表示閉包中所有 self 都是assign 的,不會強引用,但是如果對象釋放,指針地址不會變
// //如果對象被釋放,再繼續(xù)調用會出現(xiàn)野指針
// LoadData { [unowned self] in
// print(self.view)
// }
}
func LoadData(completion:() ->()) -> ()
{
//使用屬性記錄閉包 -> self對閉包引用了
completionCallBack = completion
//異步
DispatchQueue.global().async {
print("耗時操作")
Thread.sleep(forTimeInterval :2)
DispatchQueue.main.async{
//回調 執(zhí)行閉包
completion()
}
}
}
//類似OC的dealloc
deinit {
print("走了") //如果不寫此句則不會循環(huán)引用 completionCallBack = completion,此方法執(zhí)行
}
}