建立NetworkTools對(duì)象
class NetworkTools: NSObject {
/// 加載數(shù)據(jù)
///
/// - parameter finished: 完成回調(diào)
func loadData(finished: () -> ()) {
print("開(kāi)始加載數(shù)據(jù)...")
// ...
finished()
}
deinit {
print("網(wǎng)絡(luò)工具 88")
}
}
實(shí)例化NetworkTools并且加載數(shù)據(jù)
class ViewController: UIViewController {
var tools: NetworkTools?
override func viewDidLoad() {
super.viewDidLoad()
tools = NetworkTools()
tools?.loadData() {
print("come here \(self.view)")
}
}
/// 與 OC 中的 dealloc 類似,注意此函數(shù)沒(méi)有()
deinit {
print("控制器 88")
}
}
- 運(yùn)行時(shí)不會(huì)造成循環(huán)引用,因?yàn)?code>loadData執(zhí)行完畢后,就會(huì)釋放對(duì) self 的引用
修改NetworkTools,定義回調(diào)閉包屬性
/// 完成回調(diào)屬性
var finishedCallBack: (()->())?
/// 加載數(shù)據(jù)
///
/// - parameter finished: 完成回調(diào)
func loadData(finished: () -> ()) {
self.finishedCallBack = finished
print("開(kāi)始加載數(shù)據(jù)...")
// ...
working()
}
func working() {
finishedCallBack?()
}
deinit {
print("網(wǎng)絡(luò)工具 88")
}
- 運(yùn)行測(cè)試,會(huì)出現(xiàn)循環(huán)引用
解除循環(huán)引用
- 與OC類似方法
/// 類似于 OC 的解除引用
func demo() {
weak var weakSelf = self
tools?.loadData() {
print("\(weakSelf?.view)")
}
}
- Swift推薦方法
loadData { [weak self] in
print("\(self?.view)")
}
- 還可以
loadData { [unowned self] in
print("\(self.view)")
}
閉包(block)的循環(huán)引用小結(jié)
-
Swift
-
[weak self]-
self是可選項(xiàng), 如果self已經(jīng)被釋放,則為nil
-
-
[unowned self]-
self不是可選項(xiàng), 如果self已經(jīng)被釋放,則會(huì)出現(xiàn) 野指針訪問(wèn)
-
-
-
Objc
-
__weak typeof(self) weakSelf;- 如果
self已經(jīng)被釋放,則為nil
- 如果
-
__unsafe_unretained typeof(self) weakSelf;- 如果
self已經(jīng)被釋放,則出現(xiàn)野指針訪問(wèn)
- 如果
-