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, width: 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-

posted @ 2017-03-03 14:58  刀锋你好,刀锋再见  阅读(232)  评论(0编辑  收藏  举报