zoukankan      html  css  js  c++  java
  • swift循环引用测试

    我们都知道oc在使用block不当的时候会造成循环引用,那么swift会不会造成这种情况呢,我做了一下验证。

    第一步构建视图: nav ->ViewControllerA -> ViewControllerB

    这样从ViewControllerB 回退  ViewControllerA时,ViewControllerB的实例会被销毁掉。

    在ViewControllerB 插入如下代码:

     deinit {
            // 执行析构过程
            print("ViewControllerB is deinit")
        }

    实验结果:ViewControllerB is deinit,这说明 ViewControllerB 被顺利销毁掉了。

    第二步:ViewControllerB 建立一个contentView,contentView 含有一个闭包,如下:

    class UIViewB: UIView {
    
        /*
        // Only override draw() if you perform custom drawing.
        // An empty implementation adversely affects performance during animation.
        override func draw(_ rect: CGRect) {
            // Drawing code
        }
        */
        
        var test: (() -> ())?
        
        deinit {
            // 执行析构过程
            print("UIViewB is deinit")
        }
    
    }

    ViewControllerB:

       override func viewDidLoad() {
            super.viewDidLoad()
    
            let contentView = UIViewB(frame: CGRect(x: 0, y: 100,  60, height: 60))
            contentView.backgroundColor = UIColor.white
            view.addSubview(contentView)
            contentView.test = { print(self)}
            // Do any additional setup after loading the view.
        }

    这样就形成 ViewControllerB 和  UIViewB 相互持有的情况,再运行一下,结果两个的析构函数都没有运行,说明造成循环引用了,内存泄漏了。

    解决方案如下:

            contentView.test = { print(self)}
            contentView.test = {[weak self] in print(self)}

    将闭包中的self改成若引用 则可避免循环引用。

    完整代码链接:https://github.com/a5978445/swift-

  • 相关阅读:
    勒布朗法则( LeBlanc)
    [转]五分钟看懂UML类图与类的关系详解
    单片机裸机下写一个自己的shell调试器(转)
    S3C2440 偷学
    LWIP_STM32_ENC28J60(转)
    写出稳定的Modbus代码之点滴经验
    GPS数据解析
    U-BLOX GPS 模块及GPRMC指令解析
    LwIP之socket应用--WebServer和Modbus TCP
    LWIP使用经验---变态级(转)
  • 原文地址:https://www.cnblogs.com/TengSys/p/6496699.html
Copyright © 2011-2022 走看看