十分钟了解循环引用及解决办法(Swift版)

循环引用

  • 建立 NetworkTools 对象
  /// 完成回调属性
    var finishedCallBack: (()->())?
    
    /// 加载数据
    ///
    /// - parameter finished: 完成回调
    func loadData(finished: () -> ()) {
        
        self.finishedCallBack = finished
        
        print("开始加载数据...")
        
        // ...
        working()
    }
    
    func working() {
        finishedCallBack?()
    }
    
    deinit {
        print("网络工具 88")
    }
  • 实例化 NetworkTools 并且加载数据
  class ViewController: UIViewController {
        
        var tools: NetworkTools?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            tools = NetworkTools()
            tools?.loadData() {
                print("come here \(self.view)")
            }
        }
        
        /// 与 OC 中的 dealloc 类似,注意此函数没有()
        deinit {
            print("控制器 88")
        }
    }
  • 循环链:self(ViewController) -> tools(NetworkTools) ->finishedCallBack -> finished -> self(ViewController)

解决办法

  • Swift
 loadData { [weak self] in
            print("\(self?.view)")
        }
  • OC
    __weak typeof(self) weakSelf
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,318评论 3 25
  • 基本格式 在 Swift 中没有了 main.m,@UIApplicationMain 是程序入口 在 Swift...
    bagpipe阅读 2,627评论 1 4
  • 使用playground来测试代码很有意思 Xcode 7.2 如果项目名称包含中文和数字 在数组中添加元素 会造...
    一黑阅读 620评论 0 0
  • 闭包的基础我就不说了,网上多如牛毛,现在来介绍几种使用的反向传值的方法。 第一种: ViewController....
    Harely阅读 299评论 0 0
  • 介绍 Swift官方开发文档对于闭包的介绍是这样的:闭包是可以在代码中被传递和引用的功能性独立模块。Swift 中...
    Latte_Bear阅读 892评论 0 1