1. 程式人生 > >swift-防止閉包迴圈引用的方法

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方法