1、Object-C 经历两个阶段: 1、手动引用计数内存管理(Manual Reference Counting,MRC) 2、自动引用计数内存管理(Automatic Refernce Counting,ARC)

2、引用类型 内存分配到 堆 上,需要人为管理。 值类型 内存分配到 栈 上,有处理器管理。

3、每个类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,成为 引用计数(Reference Count,简称 RC)。当对象被创建时候,引用计数为1,每次对象被引用的时候会是其引用计数加1,如果不需要的时候,对象引用断开(赋值 nil),其中引用计数 减1.当对象引用计数为 0 的时候,对象内存才被释放。

  备注:init(){}  类的构造方法中 会将实例与对象建立"强引用" 关系, deinit{} 析构方法 只有当引用计数为 0 时候才会执行。

4、强引用循环:

  当两个对象的存储属性相互引用对方的时候,一个对象释放的前提是对方先释放,另一个对象释放前提也是对象先释放,这样就会导致"死锁"的状态,导致内存泄露。

解决强循环 两种方式:1、弱引用 2、无主引用。

  弱引用:允许其中一个对象不采用强引用类型方式引用另外一个对象,这样就不会引起强引用循环问题。弱引用适合与 引用对象可以没有值的情况,因为弱引用可以没有值,我们必须讲一个弱引用 声明为可选类型,使用weak 声明弱引用。

  例如:员工A类 存储属性 部门, 部门B类  部门领导(员工), 如果部门可以没有 部门领导,那么可以将 B类 部门领导 属性 使用 weak 修饰, 那么A、B 之间不存在循环引用。

  无主引用:其中一个对象不采用强引用另外一个对象。无主引用适用于引用对象永远有值情况,它总是被定义为非可选类型,使用关键字unowned。

  例如:一个员工可以没有部门,一个部门必须有部门领导,那么可以将B类  unowned var manager :Employee ,建立无主引用。

5、lazy 修饰表示 延迟加载。 lazy var fullName:()->String={ return a+b} ,类的属性 可以在闭包中使用,必须使用 lazy 延迟加载,及所有属性初始化后,self表示对象才会被创建和使用。

6、闭包引用循环: 如果闭包与捕获对象总是相互引用并且总是同时销毁,则将闭包内的捕获声明为无主引用。

           当捕获的对象有可能为nil时,则将闭包内的捕获声明为 弱引用。如果捕获的对象绝对不会为nil,那么采用无业引用。

Swift 内存管理的更多相关文章

  1. Swift 内存管理详解

    Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift 对象的回收. 注意: 只有引用类型变量所 ...

  2. swift内存管理中的引用计数

    在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: P ...

  3. Swift内存管理-示例讲解

    具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理.而对于值类型,如整型.浮点型.布尔型.字符串.元组.集合.枚举和结构体等,是由处理器自动管理的,程序员不需要 ...

  4. swift 内存管理,WEAK 和 UNOWNED

    因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内 ...

  5. Swift内存管理、weak和unowned以及两者区别

    Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一 ...

  6. Swift内存管理、weak和unowned以及两者区别(如何使用Swift 中的weak与unowned?)

    Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配. 当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当 ...

  7. swift内存管理:值类型与引用类型

    Use struct to create a structure. Structures support many of the same behaviors as classes, includin ...

  8. swift内存管理

    为了解决引用循环的问题. However, with ARC, values are deallocated as soon as their last strong reference is rem ...

  9. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

随机推荐

  1. Django BoundField

    一.BoundField from django.forms.boundfield import BoundField BoundField是一个将字段添加数据的一个类,给对应的form字段封装上数据 ...

  2. 28 Data Race Detector 数据种类探测器:数据种类探测器手册

    Data Race Detector 数据种类探测器:数据种类探测器手册 Introduction Usage Report Format Options Excluding Tests How To ...

  3. jQuery之字体大小的设置

    先获取字体大小,进行处理. 再将修改的值保存. slice() 方法可从已有的数组中返回选定的元素.arrayObject.slice(start,end).start     必需.规定从何处开始选 ...

  4. An overview of gradient descent optimization algorithms (更新到Adam)

    Momentum:解快了收敛速度,同时也减弱了SGD的波动 NAG: 减速了Momentum更新参数太快 Adagrad: 出现频率较低参数采用较大的更新,对于出现频率较高的参数采用较小的,不共用一个 ...

  5. ORA-12514: TNS:listener does not currently know of service …

    问题描述: 今天数据库查询时遇到问题,具体情形如下截图所示: 问题分析: 看错误明显是TNS监听有问题,要么配置错了,要么数据库没起来.但是当前数据库起来了,也能正常连接使用,因此 考虑被查询对象可能 ...

  6. GitHub如何使用

    先马克一下,有空看看:http://blog.csdn.net/xiahouzuoxin/article/details/9393119

  7. 关于主键的设计、primary key

    主键:用于唯一标识一个表中一行数据. 外键:用于建立两个表之间的关系,A表中有一列是B表中的主键,那么A表中这列的数据就受到B表主键的约束. 那么关于主键应该如何设计呢,这里我说下优缺点: 1.用自动 ...

  8. (四)SpringMvc文件上传

    第一节:SpringMvc单文件上传 第二节:SpringMvc多文件上传

  9. C# TabControl 隐藏标签头(TabControl Hide Head)

    TabControl控件,有时候需要动态显示一个或者多个标签页,如果只是显示一个标签页的时候不想显示标签头,所以有可能隐藏头部的需求. 如下代码可以实现 public Form1() { Initia ...

  10. 易普优高级计划排程Light版助力中小企业实现精益化计划

    易普优高级计划排程Light版助力中小企业实现精益化计划 一.业务与排产需求 根据统计,目前中小企业已经占到我国工业企业总数的95%以上,对中国GDP贡献超过60%,税收超过了50%,提供了70%的进 ...