美文网首页
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闭包的循环引用

    我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己...

  • iOS闭包循环引用精讲

    iOS闭包循环引用精讲 iOS闭包循环引用精讲

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • Swift语法--12-3闭包的循环引用

    Swift语法--12-3闭包的循环引用 闭包循环引用产生条件 如果在HttpTool中有对闭包进行强引用,则会形...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包中的循环引用及解决方法

    闭包中的循环引用 闭包中的循环引用原理和OC中的block类似。即对象A强引用了对象B,然后B也强引用了A。示例如...

  • swift中的内存管理

    基于引用计数的ARC内存管理 循环引用 使用[weak ***]解决循环饮用 逃逸闭包 闭包的调用逃离了函数的作用域

  • 2019-12-04

    swift 闭包循环引用产生以及处理

  • Swift5.0 闭包

    本文目录: 闭包 尾随闭包 逃逸闭包 自动闭包 循环引用 闭包 全局函数:有名字,不捕获任何值; 嵌套函数:有名字...

网友评论

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

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