美文网首页
swift-24闭包的循环引用

swift-24闭包的循环引用

作者: sunmumu1222 | 来源:发表于2017-08-30 09:12 被阅读17次

    我以前做的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("挥手拜拜")
        }
    }
    

    相关文章

      网友评论

          本文标题:swift-24闭包的循环引用

          本文链接:https://www.haomeiwen.com/subject/niszdxtx.html