zoukankan      html  css  js  c++  java
  • Swift内存管理-示例讲解

    具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要管理它们的内存。
    一、引用计数
    每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为0的时候,对象的内存才被释放。
    下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。


    二、示例:Swift自动引用计数
    下面我们通过一个示例了解一下Swift中的自动引用计数原理。下图是Employee类创建的对象的生命周期,该图描述了对象被赋值给3个变量,以及它们的释放过程。


    示例代码如下:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. class Employee {                ①  
    2. var no : Int  
    3. var name : String  
    4. var job : String  
    5. var salary : Double  
    6.   
    7.   
    8. init(no : Int, name: String, job : String, salary : Double) {   ②  
    9.     self.no = no  
    10.     self.name = name  
    11. self.job = job  
    12. self.salary = salary  
    13. println("员工(name) 已经构造成功。")    ③  
    14.     }  
    15. deinit {                            ④  
    16. println("员工(name) 已经析构成功。")    ⑤  
    17.     }      
    18. }  
    19.   
    20.   
    21. var ref1: Employee?         ⑥  
    22. var ref2: Employee?         ⑦  
    23. var ref3: Employee?         ⑧  
    24.   
    25.   
    26. ref1 = Employee(no: 7698, name: "Blake", job :"Salesman", salary : 1600)    ⑨  
    27.   
    28.   
    29. ref2 = ref1                     ⑩  
    30. ref3 = ref1                     ⑪  
    31.   
    32.   
    33. ref1 = nil                      ⑫  
    34. ref2 = nil                      ⑬  
    35. ref3 = nil                      ⑭  



    上述代码第①行声明了Employee类,第②行代码是定义构造器,在构造器中初始化存储属性,并且在代码第③行输出构造成功信息。第④行代码是定义析构器,并在代码第⑤行输出析构成功信息。

    代码第⑥~⑧行是声明3个Employee类型变量,这个时候还没有创建Employee对象分配内存空间。代码第⑨行是真正创建Employee对象分配内存空间,并把对象的引用分配给ref1变量,ref1与对象建立“强引用”关系,“强引用”关系能够保证对象在内存中不被释放,这时候它的引用计数是1。第⑩行代码ref2 = ref1是将对象的引用分配给ref2,ref2也与对象建立“强引用”关系,这时候它的引用计数是2。第⑪行代码ref3 = ref1是将对象的引用分配给ref3,ref3也与对象建立“强引用”关系,这时候它的引用计数是3。
    然后在代码第⑫行通过ref1 = nil语句断开ref1对Employee对象的引用,这时候它的引用计数是2。以此类推,ref2 = nil时它的引用计数是1,ref3 = nil时它的引用计数是0,当引用计数为0的时候Employee对象被释放。
    我们可以测试一下看看效果,如果设置断点单步调试,会发现代码运行完第⑨行后控制台输出:
    员工Blake 已经构造成功。
    析构器输出的内容直到运行完第⑭行代码才输出:
    员工Blake 已经析构成功。

    这说明只有在引用计数为0的情况下才调用析构器,释放对象。

    更多内容请关注国内第一本Swift图书《Swift开发指南》
    本书交流讨论网站:http://www.51work6.com/swift.php
    欢迎加入Swift技术讨论群:362298485

    欢迎关注智捷iOS课堂微信公共平台

  • 相关阅读:
    《C++ Primer(第五版)》知识巩固
    Ubuntu下配置安装Hadoop 2.2
    Golang框架beego和bee的开发使用
    C++下混合编译c语言方法总结
    算法导论学习笔记1---排序算法(平台:gcc 4.6.7)
    基于web端去除空格小工具
    Google Map API抓取地图坐标信息小程序
    【算法导论】散列表
    【算法导论】二叉搜索树
    【算法导论】基本数据结构
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3956813.html
Copyright © 2011-2022 走看看