Swift4.0 学习笔记 第十九节:解除循环引用

//
//  ViewController.swift
//  006-循环引用
//
//  Created by 庄壮勇 on 2018/1/8.
//  Copyright © 2018年 Personal. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    // 属性就是一个var
    var completionCallBack: (()->())?
   
    override func viewDidLoad() {
        super . viewDidLoad ()
        // block 中如果出现 self. 要特别小心!
        // 循环'引用' 单方向的引用是不会产生循环引用
        // 只是闭包对 self. 进行了copy, 闭包执行完成之后,会自动销毁,同时释放对 self 的引用
        // - 同时需要self 对闭包引用
       
        // 解除循环引用,需要打断链条
        // 方法1: OC 的方式
        // 细节1 var, weak 只能修饰 var ,不能修饰 let
        // 'weak' must be a mutable variable, because it may change at runtime
        // weak 可能会被在运行时被修改 -> 指向的对象一旦被释放,会被自动设置为nil
        // ViewController?
//        weak var weakSelf = self
//        loadData {
//            // 细节 2
//            // 解包有两种方式的解包
//            // ?可选解包 - 如果self 已经被释放,不会向对象发送 getter的消息,更加安全
//            // !强行解包 - 如果self 已经被释放,强行解包会导致崩溃!
//            /**
//                 weakSelf.view - 只是单纯的发送消息,没有计算
//                 强行解包,因为需要计算,可选项不能直接参与到计算!
//             */
//            print(weakSelf?.view ?? "")
//        }
       
        // 方法2 - Swift 的推荐方法
        // [weak self] 表示 {} 中的所有self都是弱引用,需要注意解包
        // OC __weak
        loadData { [weak self ] in
            print ( self ?. view as Any )
        }
       
        // 方法3 - Swift 的另一个方法,知道就好
        // [unowned self] 表示{} 中的所有self都是assign的,不会强引用,但是,如果对象释放,指针地址不会改变
        // 如果对象被释放,继续调用,就会出现野指针的问题
        // OC __unsafe_unretained
//        loadData { [unowned self] in
//            print(self.view)
//        }
    }

    func loadData(completion:  @escaping ()->()) -> (){
       
        // 使用属性记录闭包
        completionCallBack = completion
        Thread . sleep (forTimeInterval: 3 )
       
        // 异步
        DispatchQueue . global (). async {
           
            print ( "耗时操作" )
            DispatchQueue . main . async {
                completion()
            }
        }
       

    }
   
    // 类似于 OC 的 dealloc
    deinit {
        print ( "我去了" )
    }
   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值