zoukankan      html  css  js  c++  java
  • 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:当占有的引用和闭包总是会同时销毁时

  • 相关阅读:
    hdu 3415 Max Sum of MaxKsubsequence
    poj 2243 Knight Moves
    【LCD手册】飞凌3.5/4.3/5.6/7/8 寸LCD手册大全下载
    【转载zq2002好文章】Windows CE 休眠唤醒全面解析(基于2440平台)(1)(2)(3)
    【转载】如果做到窗口自动适应不同尺寸屏幕的尺寸?
    【转载】wince6.0+s3c6410摄像头驱动修改
    推荐一个比较活跃的ARM/WinCE/LinuxQQ群
    【转载】微软的USB摄像头驱动,
    【收集】ARM+WinCE QQ 群
    【转载】S3C6410移植日记系列
  • 原文地址:https://www.cnblogs.com/wannaGoBoy/p/6728653.html
Copyright © 2011-2022 走看看