美文网首页Swift_Learn
闭包引起的循环引用问题

闭包引起的循环引用问题

作者: 张义飞 | 来源:发表于2017-03-16 16:00 被阅读0次

闭包的内存管理

  • 为什么苹果要区分逃逸闭包和非逃逸闭包类,当然是从性能优化上考虑的。上篇文章我们说非逃逸闭包的作用域是在函数体内那函数结束后,函数体临时数据都会释放掉,对于逃逸闭包,作用域超过了函数体,那它为了防止被释放掉,它就会把自己复制一份。这样如果你在闭包里访问了当前对象的属性或者方法,那么这个闭包就对这个对象强引用,要是处理不当就会出现循环引用的危险(如果恰巧这个对象也强引用了这个闭包)。下面我们就研究一下下循环引用如何出现的。

class Person: NSObject {
    var name: String?
    var age: Int?
    var changName: (() -> ())?
    
    init(name: String?, age: Int?) {
        self.name = name
        self.age = age
    }
}

let p1 = Person(name: "Bill", age: 15)

p1.changName = { Void in
    print(p1.name ?? "Bill")
}

p1.changName!()

  • 我们看到P1对闭包进行了强引用,然后闭包里又使用了p1.name这样闭包又对p1进行了一次强引用
QQ20170316-152929@2x.png
  • 如何解决这种强引用类,我们要使用[weak 该引用对象]

p1.changName = {[weak p1] Void in
    print(p1?.name ?? "Bill")
}

p1.changName!()

QQ20170316-153027@2x.png

*来画个牛逼的图看看

QQ20170316-154213@2x.png
  • 总上所属不是闭包里一定要使用[weak ],而是你要看看这个闭包里使用了该对象的属性和方法没,如果使用了对不起,您造成了循环引用,请处理。如果查看项目是否有循环引用的问题。请自行百度吧!

造成循环引用的还有其他几种情况,解决循环引用的方法也不止这一种,有时间写一篇介绍循环引用的文章吧

下节传送门

相关文章

  • 闭包引起的循环引用问题

    闭包的内存管理 为什么苹果要区分逃逸闭包和非逃逸闭包类,当然是从性能优化上考虑的。上篇文章我们说非逃逸闭包的作用域...

  • Swift 闭包的使用坑

    很多人在使用闭包的时候容易引起循环引用,解决循环引用的问题可以使用 [unowned self] 和 weak v...

  • iOS闭包循环引用精讲

    iOS闭包循环引用精讲 iOS闭包循环引用精讲

  • Swift入门二(对象函数)

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

  • Day2

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

  • swift重温笔记(自动引用计数)

    自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 ...

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

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

  • Swift Tour Learn (九) -- Swift 语法

    本章将会介绍 自动引用计数的工作机制自动引用计数实践类实例之间的循环强引用解决实例之间的循环强引用闭包引起的循环强...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • swift闭包的循环引用

    类似于OC的block,swift闭包中也存在循环引用的问题,通常解决闭包中循环引用的方式有以下三种(1)方式一:...

网友评论

    本文标题:闭包引起的循环引用问题

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