美文网首页
swift函数赋值给闭包引起的循环引用

swift函数赋值给闭包引起的循环引用

作者: yuandiLiao | 来源:发表于2017-07-19 15:21 被阅读0次

swift的闭包就类似oc中的block回调,使用的过程中可能会引起循环引用,从而造成内存泄漏。
这里记录之前公司项目中一个比较另类的使用造成的循环引用。就是把一个函数直接传给闭包,造成的引用。看一下代码比较清楚

import UIKit

class SecondViewController: UIViewController {
    let test = TestObject()
    override func viewDidLoad() {
        super.viewDidLoad()    
        self.test.select =  self.selectButton(index:)
        }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.test.doSomethine()
    }
    func selectButton(index:Int){
        print(index)
    }
    deinit {
        print("deinit")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

import UIKit

typealias selectBtnBlock = (_ index:Int)->()

class TestObject: NSObject {
    var select:selectBtnBlock?
    
    func doSomethine(){
        self.select!(1)
    }
    deinit {
        print("6666")
    }
}

这里有个SecondViewController的控制器,里面持有一个TestObject的对象,而TestObject对象中有一个typealias selectBtnBlock = (_ index:Int)->()的闭包属性。然后在SecondViewController控制器中直接将一个self.selectButton(index:)的函数赋值给TestObject对象的闭包,这是引起循环引用的关键。

 self.test.select =  self.selectButton(index:)

这段代码运行是没有报错的,但是这样直接赋值了之后,TestObject对象就直接对SecondViewController对象进行了strong强引用。两者相互持有造成了循环引用。这时候想到的是我对self进行weak引用,然后再指向函数可不可以呢?如下,结果还是不行的,因为selectButton的方法在self的内存中,还是被TestObject强引用持有着。

weak var weakself = self
self.test.select =  weakself?.selectButton(index:)

最后只能是闭包用闭包的形式实现,不能直接指向函数,解决方法如下两种

//方法1
self.test.select = { [weak self] i in
    self?.selectButton(index: i)
}
//方法2
weak var weakself = self
self.test.select  = {i in
    weakself?.selectButton(index: i)
}

相关文章

  • swift函数赋值给闭包引起的循环引用

    swift的闭包就类似oc中的block回调,使用的过程中可能会引起循环引用,从而造成内存泄漏。这里记录之前公司项...

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • 装饰器

    闭包 运行结果 闭包的作用: 1.函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递 2.闭...

  • Swift语法--12-3闭包的循环引用

    Swift语法--12-3闭包的循环引用 闭包循环引用产生条件 如果在HttpTool中有对闭包进行强引用,则会形...

  • 2019-12-04

    swift 闭包循环引用产生以及处理

  • Swift--内存管理

    Swift内存管理概述 强引用循环 打破强引用循环 闭包中的强引用循环 Swift内存管理概述 Swift中的AR...

  • swift懒加载不需要使用weak unowned

    swift懒加载的闭包内部使用self,不会导致循环引用,原因是因为swift的懒加载闭包是非逃逸闭包@noesc...

  • Swift5.0 闭包

    本文目录: 闭包 尾随闭包 逃逸闭包 自动闭包 循环引用 闭包 全局函数:有名字,不捕获任何值; 嵌套函数:有名字...

  • Swift - 函数,闭包,解除闭包循环引用

    摘要:闭包类似于 OC 的bock,但是比OC的block应用更广;在OC 中block是匿名的函数;在swift...

网友评论

      本文标题:swift函数赋值给闭包引起的循环引用

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