我以前做的swift筆記, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以當做自己的一份文檔.
import UIKit
class ViewController: UIViewController {
//屬性 var 定義
var completionCallBack: (()->())?
override func viewDidLoad() {
// 閉包如果出現(xiàn) self. 要特別小心
// "循環(huán)"引用 單方向對引用是不會產生循環(huán)引用!
// 只是閉包對self進行了copy 閉包執(zhí)行完成之后 會自動銷毀 同時釋放對self的引用
// 同時需要 self 對閉包引用 才會形成循環(huán)引用
// 'weak' must be a mutable variable, because it may change at runtime
// weak 可能會被在運行時被修改 -> 指向的對象一旦被釋放 會被自動設置為nil
/**
循環(huán)引用 需要打斷鏈條
法一 oc的方法
*/
super.viewDidLoad()
// weak var weakSelf = self
// loadData {
// /** 細節(jié)
// ? 可選解包 如果 self已經被釋放 不會向對象發(fā)送getter的消息 更加安全
// ! 強行解包 如果 self已經被釋放 強行解包會導致奔潰
// */
// /**
// weakSelf?.view 只是單純的發(fā)送消息 沒有計算
// 強行解包 因為需要計算 可選項不能直接參與到計算
// */
// //使用xcode8 的內存圖
// print(weakSelf!.view)
// print(self.view)
// }
/**
法二 swift的推薦方法
與oc的 __weak typeof (self) weakSelf = self; 等效
[weak self] 表示 {} 中的所有self 都是弱引用 需要注意解包
*/
loadData { [weak self] in
print(self?.view ?? "self被釋放")
}
/**
法三 swift的另外一個用法 知道就好
[unowned self] 表示 {} 中的所有 self都是assign的 不會強引用 但是 如果對象釋放 指針地址不會變化
與oc的 __unsafe_unretained typeof (self) weakSelf = self; 等效
如果對象被釋放 繼續(xù)調用 就會出現(xiàn)野指針的問題
self 不要解包
*/
loadData { [unowned self] in
print(self.view ?? "self被釋放")
}
}
func loadData(completion:@escaping ()->()) -> () {
//使用屬性記錄閉包 self對閉包引用了
completionCallBack = completion
//異步
DispatchQueue.global().async {
print("耗時操作")
DispatchQueue.main.async {
//回調 執(zhí)行閉包
completion()
}
}
}
deinit {
print("揮手拜拜")
}
}