美文网首页
Swift 循环引用 小结

Swift 循环引用 小结

作者: WMSmile | 来源:发表于2019-09-30 14:53 被阅读0次

    在项目中自己写出了一个循环引用的典型例子,如下
    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是可选的类型

    相关文章

      网友评论

          本文标题:Swift 循环引用 小结

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