// 方法1: OC 的方法
// weakSelf -> ViewController?
// self - ViewController
// 'weak' must be a mutable variable, because it may change at runtime
// weak 的变量在运行时有可能被设置为 nil,weak不能使用 let
// weak var weakSelf = self
// loadData { (result) -> () in
// print(result)
// print(weakSelf)
// }
// 方法2: Swift 的方法 - 首选
// [weak self] 表示 闭包中的 self 都是弱引用的,不需要再使用其他的变量
// weak 的变量在运行时有可能被设置为 nil,所以闭包中的 self,都是可选的
loadData { [weak self] (result) -> () in
// unexpectedly found nil while unwrapping an Optional value
// ! 强行解包,值不存在抛出异常
// ? 可选解包,值不存在,给nil发送消息
print(self?.view)
}
// 方法3: [unowned self]
// [unowned self] 和 OC 中的 assign 是一样的,对象释放之后,指针保持不变
// 1> 闭包中不需要考虑解包的问题
// 2> 但是如果 self 释放,会出现野指针访问
// loadData { [unowned self] (result) -> () in
// // EXC_BREAKPOINT 野指针访问
// print(self.view)
// }