美文网首页
swift的内存管理机制

swift的内存管理机制

作者: HJXu | 来源:发表于2016-01-09 01:33 被阅读70次

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

一、引用计数

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

下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。

二、示例:Swift自动引用计数

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

classEmployee{①

varno : Int

varname : String

varjob : String

varsalary : Double

init(no : Int, name: String, job : String, salary : Double) {   ②

self.no = no

self.name = name

self.job = job

self.salary = salary 

println("员工\(name) 已经构造成功。") ③

 } 

deinit { ④ 

println("员工\(name) 已经析构成功。") ⑤

 }

 }

varref1: Employee? ⑥

varref2: Employee? ⑦

varref3: Employee? ⑧ 

ref1 = Employee(no:7698, name:"Blake", job :"Salesman", salary :1600) ⑨ 

ref2 = ref1 ⑩ 

ref3 = ref1 ⑪ 

ref1 = nil ⑫ 

ref2 = nil ⑬

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内存管理 1. Swift提供了强大的内存管理机制:Swift通过自动引用计数(ARC)可以很好...

  • swift内存管理

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Swift使用自动引用计数

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Swift - 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一...

  • swift基础—自动引用计数

    Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一...

  • OneDayOneSwift[16] - Automatic R

    Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一...

  • Swift5.1—自动引用计数

    Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一...

  • swift 自动引用计数

    Swift 使用自动引用计数(ARC)机制管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一直起作用...

  • Swift -- 类实例之间的循环强引用问题

    Swift使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一直...

  • 14-Swift自动引用计数(循环引用的解决)

    swift使用自动引用计数(ARC)机制来跟踪和管理应用程序的内存。一般情况下,swift内存管理机制会一直起作用...

网友评论

      本文标题:swift的内存管理机制

      本文链接:https://www.haomeiwen.com/subject/jwxqkttx.html