美文网首页
swift 学习之自动引用计数

swift 学习之自动引用计数

作者: Harry_Coding | 来源:发表于2017-07-25 11:23 被阅读14次

    学习和研究的主要是“实例对象和实例对象直接的相会强引用所产生的内从泄漏”和“使用闭包产生的强引用造成的内存泄漏”
    注意:只有以引用类型存储或者传递的才会存在自动引用计数,比如类,闭包,而枚举、结构体等这都是值存储,值传递不存在引用计数问题(其实也就是Object-c中我们熟悉的ARC,和他的原理是一样的)

    实例对象和实例对象之间的相互引用造成的内存泄漏
    1>产生原因
    两个类中都有对方类的实例变量作为自己的属性,举个例子:创建一个Person类和一个Clazz类

    Class Person {
    var clazz:Clazz?
    }
    Class Clazz {
    var person:Person?
    }
    // 创建两个对象,并且赋值给对方就会造成循环引用
    let jason = Person()
    let class1_1 = Clazz()
    jason.clazz = class1_1
    class1_1.person = jason
    上面的例子,就是一个循环引用的例子,jason->Person<->class1_1->Clazz .
    2> 那么该怎么解决这个问题呢
    在Objective-C中我们知道解决这种类与类之间的强引用,就是声明属性的时候一个用强引用一个用弱引用,那么在swift中是如何解决这种问题的呢?
    swift 提供了两种方式:弱引用(weak修饰)和无主引用(unowned修饰)
    使用法则:弱引用在生命周期内有可能变成nil使用,一旦申明就不会变成nil用无主引用 。
    事实上规则还是和objective-C的规则一样,遇到这种情况也是一个用强引用一个用弱引用或者无主引用。
    注意:存在一种特殊的情况,那就是这两个类各自持有的对方实例对象都必须有值,那么这种情况就需要一个用无主引用,一个用隐式展开可选属性

    闭包循环引用造成的内存泄漏
    1>造成原因:这是一种闭包和类之间的引用造成的。具体原因就是:一个类将闭包作为自己的属性,然后在类中给闭包赋值,在闭包中又引用了自身,造成循环引用,内存泄漏
    2>解决问题的办法
    在objective-C中我们解决的办法就是重新声明类实例为__weak/__block,两个修饰词的区别是__weak只能修饰对象,而__block可以修饰对象和普通变量(需要在block里修改的变量)
    而在swift中出现了一个新的概念:占有列表,在swift就是通过定义占有列表来解决闭包的循环引用的
    占有列表:占有列表中的每个元素都是由weak或者unowned关键字和实例的引用组成的。
    那么什么时候用weak:当占有的引用有时可能为nil的时候
    unwoned:当占有的引用和闭包总是会同时销毁时

    相关文章

      网友评论

          本文标题:swift 学习之自动引用计数

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