我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己的一份文档.
import UIKit
class ViewController: UIViewController {
//属性 var 定义
var completionCallBack: (()->())?
override func viewDidLoad() {
// 闭包如果出现 self. 要特别小心
// "循环"引用 单方向对引用是不会产生循环引用!
// 只是闭包对self进行了copy 闭包执行完成之后 会自动销毁 同时释放对self的引用
// 同时需要 self 对闭包引用 才会形成循环引用
// 'weak' must be a mutable variable, because it may change at runtime
// weak 可能会被在运行时被修改 -> 指向的对象一旦被释放 会被自动设置为nil
/**
循环引用 需要打断链条
法一 oc的方法
*/
super.viewDidLoad()
// weak var weakSelf = self
// loadData {
// /** 细节
// ? 可选解包 如果 self已经被释放 不会向对象发送getter的消息 更加安全
// ! 强行解包 如果 self已经被释放 强行解包会导致奔溃
// */
// /**
// weakSelf?.view 只是单纯的发送消息 没有计算
// 强行解包 因为需要计算 可选项不能直接参与到计算
// */
// //使用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; 等效
如果对象被释放 继续调用 就会出现野指针的问题
self 不要解包
*/
loadData { [unowned self] in
print(self.view ?? "self被释放")
}
}
func loadData(completion:@escaping ()->()) -> () {
//使用属性记录闭包 self对闭包引用了
completionCallBack = completion
//异步
DispatchQueue.global().async {
print("耗时操作")
DispatchQueue.main.async {
//回调 执行闭包
completion()
}
}
}
deinit {
print("挥手拜拜")
}
}
网友评论