Swift 循环引用 小结

在项目中自己写出了一个循环引用的典型例子,如下
Viewcontroller

class FirstViewController: UIViewController {

    var baseView:BaseView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.baseView = BaseView()
        self.baseView?.backgroundColor = UIColor.red;
        self.view.addSubview(self.baseView!)
        self.baseView?.superself = self
        
    }
    
    deinit {
        print("first dealloc")
    }

}

BaseView

class BaseView: UIView {
    //    这边必须使用weak 或者 unowned
    weak var superself:UIViewController?
// unowned var superSelf:UIViewController?
    override init(frame: CGRect) {
        super.init(frame: frame);
        initViews();
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
  
    //MARK:-
    func initViews() -> Void {

    }

}

注:BaseView 所有子类也必须使用weak 来方式循环引用

block块的循环引用 我就不再多说了,其他博客有详解的,主要使用self的地方要使用 [unowned self][weak self]

简单的小例子

//
//  BaseView.swift
//  CycleCount
//
//  Created by wumeng on 2019/9/2.
//  Copyright © 2019 wumeng. All rights reserved.
//

import UIKit

class BaseView: UIView {
    
    //    这边必须使用weak
    weak var superself:UIViewController?
    
    override init(frame: CGRect) {
        super.init(frame: frame);
        initViews();
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    //MARK:-
    func initViews() -> Void {
        
//        使用 [unowned self] 和 [weak self]  防止循环引用 。
        
//        [unowned self] 是和self 共存的block 同时释放
        let clickHandler:(() -> Void) = {[unowned self] in
            
            self.WM_FUNC_block()

        }
        
        clickHandler()

//        [weak self]这时候的self是可选的类型
        let clickHandler1:(() -> Void) = {[weak self] in

            if self != nil {
                self!.WM_FUNC_block()
            }
        }

        clickHandler1()

    }
    //MARK:- blcok
    func WM_FUNC_block() -> Void {
        
    }


}


使用 [unowned self] 和 [weak self] 防止循环引用 。

  • [unowned self] 是和self 共存的block 同时释放,
  • [weak self]这时候的self是可选的类型
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容