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 来方式循环引用 也可以用unowned

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是可选的类型
发布了121 篇原创文章 · 获赞 54 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/wm9028/article/details/100221531