• swift 学习之自动引用计数


    swift 学习之自动引用计数

    • 学习和研究的主要是“实例对象和实例对象直接的相会强引用所产生的内从泄漏”和“使用闭包产生的强引用造成的内存泄漏”

    注意:只有以引用类型存储或者传递的才会存在自动引用计数,比如类,闭包,而枚举、结构体等这都是值存储,值传递不存在引用计数问题(其实也就是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:当占有的引用和闭包总是会同时销毁时

  • 相关阅读:
    jenkins 持续集成iOS开发
    CocoaPods 简介
    iOS 10 Programming Fundamentals with Swift 学习笔记 0
    人生,从来没有白走的路
    Oracle数据库备份与恢复命令
    远程备份数据库文件
    恢复误删数据库数据
    Oracle同义词创建及其作用
    同义词使用案例
    ORA-01940无法删除当前已连接用户
  • 原文地址:https://www.cnblogs.com/wannaGoBoy/p/6728653.html
Copyright © 2020-2023  润新知