1、ARC

  • 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0,此时系统会自动释放实例所占用的内存空间,一旦释放就不能再访问这个实例的属性和方法。由于该过程是自动的,不需要开发人员来开辟和释放内存,因此称为自动引用计数,简称 ARC(Automatic Reference Counting)。

    • 为了避免使用中的实例被释放,ARC 会跟踪并计算每一个实例被多少属性、常量和变量所引用。
    • 引用有强引用和弱引用之分,这是为了保证在某些循环引用的情况下可以打破循环。
    • 为了保证实例在被属性、常量和变量引用时不会被意外释放,引用默认情况下会被设定为强引用。

1.1 ARC 示例

  • 在构造器和析构器中分别写一个打印语句,用来标示实例的创建和销毁。

    class Student {
    
        var name: String
    var age: Int init(name: String, age: Int) {
    self.name = name
    self.age = age print("创建了一个实例")
    } deinit { print("销毁了一个实例")
    }
    }
  • 声明两个变量,把它们的类型声明为 Student 的可选型,现在它们还没有被赋值。

    var xiaoming: Student?
    var xiaogang: Student?
  • 通过构造器创建一个 Student 的实例,然后把这个实例赋值给第一个变量。

    xiaoming = Student(name: "xiaoming", age: 12)
  • 此时运行程序输出如下。

    创建了一个实例
  • 这次让第二个变量也引用这个实例,现在这个实例的引用计数为 2,代表着 Student 实例的内存地址被引用了两次。

    xiaogang = xiaoming
  • 下面通过给变量赋值 nil 来断开引用,首先断开一个变量的引用,现在 Student 实例的引用计数已变为 1。

    xiaogang = nil
  • 接着断开第二个变量的引用,现在没有任何属性或者变量引用这个实例了。

    xiaoming = nil
  • 可以看到中控台打印信息如下,这个类调用了析构器,代表它被销毁了,释放出了实例所占用的内存空间。

    销毁了一个实例
  • 看起来只是引用的数量增减那么简单,不过在真实的内存中,ARC 在检验某个对象的计数时不可避免的需要对堆内存进行加锁和解锁处理,也就是说无论你如何在代码层面优化代码,ARC 本身仍会带来一部分性能的损耗,这也解释了为什么值类型是更好的选择。

Swift ARC 自动引用计数的更多相关文章

  1. swift:自动引用计数ARC

    Swift自动引用计数:ARC    原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...

  2. obj-c编程11:内存管理和ARC(自动引用计数)

    乖乖隆地洞,这篇文章内容可是不得了,内存管理哦!首先,这个要是搞不明白,你就等着进程莫名其妙的挂死,或是疯狂申请内存却不释放,结果被OS杀死,不管是"自杀"还是"他杀&q ...

  3. ARC————自动引用计数

    一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...

  4. Swift 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...

  5. swift学习笔记之-自动引用计数

    //自动引用计数 import UIKit /*自动引用计数(Automatic Reference Counting) 防止循环强引用 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用 ...

  6. swift 学习- 18 -- 自动引用计数

    // Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...

  7. Swift5 语言指南(二十五) 自动引用计数(ARC)

    Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...

  8. Swift2.1 语法指南——自动引用计数

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  9. Welcome-to-Swift-16自动引用计数(Automatic Reference Counting)

    Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...

随机推荐

  1. bzoj2654

    题解: 老早看的并没有写 wqs二分的原理和这个凸函数的性质已经证明过了 写的时候 主要的问题在于每次的答案是一个范围 什么意思呢 其实比较简单的做法是 优先取白边,优先取黑边做两次 然后看一下要求的 ...

  2. 【LOJ】#2187. 「SHOI2014」三叉神经树

    题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把 ...

  3. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  4. Codeforces Round #428 (Div. 2)

    终于上蓝名了,hahahahaha,虽然这场的 B 题因为脑抽了,少考虑一种情况终判错了,还是很可惜的.. B题本来过来1500个人,终判之后只剩下了200多个,真的有毒!!!! A - Arya a ...

  5. 4.Django|ORM模型层

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  6. Ubuntu 安装 H3C iNode 客户端

    Ubuntu 安装 H3C iNode 客户端 ​ 之前在网上找了很多方法,也找了不少的安装包,却由于各种各样的问题,最后都没有成功(因为自己太菜).而学校用的就是iNode,客户端装不了,只能用Wi ...

  7. C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试

    正式工作之后,公司对于单元测试要求比较严格.(笔者之前比较懒,一般很少写完整的单测~~).作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(T ...

  8. Git学习笔记:基础篇

    git可以说是所有开发者出开发语言之外的最基本的基本功了,熟悉git可以方便的进行代码版本控制,以及与其他开发者进行合作开发.本文内容是我以往学习git时做的笔记,主要是关于git最基本的操作,但 只 ...

  9. PHP Zend Email验证函数MailVal()函数的使用

    PHP Email验证 <?php /************************************************************************ *此功能检 ...

  10. map在遍历数据的过程中删除数据不出错

    // Iterator<Map.Entry<String,Long>> entries = Map.entrySet().iterator();                 ...