swift-防止閉包迴圈引用的方法
迴圈引用場景描述
有兩個類HttpTool類和ViewController類,ViewController有HttpTool屬性,HttpTool中有callBack型別的閉包做屬性;
即ViewController引用了HttpTool例項,HttpTool裡引用了callBack,callBack的實現方法中又呼叫了self.view(ViewController.view)造成了迴圈引用
class HttpTool: NSObject {
var callBack:((String)->())?
func loadData (callBack:@escaping((String)->())){
DispatchQueue.global().async {
DispatchQueue.main.async {
callBack("json資料")
self.callBack = callBack;
}
}
}
}
class ViewController: UIViewController {
let too:HttpTool = HttpTool()
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){
// 閉包去迴圈引用方法一
weak var weakSelf = self;
too.loadData { (jsonData:String) in
print(jsonData)
/*
weakSelf?view
如果前邊的可選型別,沒有值,後邊的程式碼不會執行
如果前邊的可選型別,有值,系統會自動將weakSelf進行解包,並且使用weakSelf
**/
weakSelf?.view.backgroundColor = UIColor.red
}
//閉包去迴圈引用方式二 [unowned self] 下邊self不用寫?,self如果沒值,下邊會發生崩潰
///*
// __weak 與__unsafe_unretained的區別
// __weak指向的物件一旦被銷燬,則指標會指向nil(0x00)
// __unsafe_unretained依然指向之前物件的記憶體地址,會造成野指標
// oc中的__unsafe_unreatined相當於swift中的unowned,故unowned
// **/
too.loadData {[unowned self](jsonData:String) in
print(jsonData)
/*
weakSelf?view
如果前邊的可選型別,沒有值,後邊的程式碼不會執行
如果前邊的可選型別,有值,系統會自動將weakSelf進行解包,並且使用weakSelf
**/
self.view.backgroundColor = UIColor.red
}
//閉包去迴圈引用方式三 [weak self]方法是方法一的簡略形式
too.loadData {[weak self](jsonData) in
print(jsonData)
/*
weakSelf?view
如果前邊的可選型別,沒有值,後邊的程式碼不會執行
如果前邊的可選型別,有值,系統會自動將weakSelf進行解包,並且使用weakSelf
**/
self?.view.backgroundColor = UIColor.red
}
}
最常用的是方法三
swift中判定某物件是否銷燬的依據是看該類的deinit方法是否執行了,相當於oc的dealloc方法