Swift内存管理-示例讲解
具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要管理它们的内存。
一、引用计数
每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为0的时候,对象的内存才被释放。
下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。
二、示例:Swift自动引用计数
下面我们通过一个示例了解一下Swift中的自动引用计数原理。下图是Employee类创建的对象的生命周期,该图描述了对象被赋值给3个变量,以及它们的释放过程。
示例代码如下:
- class Employee { ①
- var no : Int
- var name : String
- var job : String
- var salary : 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) 已经析构成功。") ⑤
- }
- }
- var ref1: Employee? ⑥
- var ref2: Employee? ⑦
- var ref3: 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的情况下才调用析构器,释放对象。
欢迎关注智捷iOS课堂微信公共平台
Swift内存管理-示例讲解的更多相关文章
- Swift 内存管理详解
Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift 对象的回收. 注意: 只有引用类型变量所 ...
- 简单的例子 关于Java内存管理的讲解
我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? ...
- swift内存管理中的引用计数
在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: P ...
- swift 内存管理,WEAK 和 UNOWNED
因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内 ...
- Linux内存管理—详细讲解
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- Swift 内存管理
1.Object-C 经历两个阶段: 1.手动引用计数内存管理(Manual Reference Counting,MRC) 2.自动引用计数内存管理(Automatic Refernce Count ...
- Swift内存管理、weak和unowned以及两者区别
Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一 ...
- Swift内存管理、weak和unowned以及两者区别(如何使用Swift 中的weak与unowned?)
Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配. 当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当 ...
- Linux系统基本的内存管理知识讲解
内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个 ...
随机推荐
- MEF 编程指南(一):在应用中托管 MEF
在应用程序中托管(Hosing) MEF 涉及到创建组合容器(CompositionContainer) 实例,添加可组合部件(Composable Parts),包括应用程序宿主(Host)本身并进 ...
- MFC视图切换大全总结
单纯视图之间的切换 单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了.我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类:第二是在分割窗格的一个窗格内实行视 ...
- Codeforces Round #277 (Div. 2) B. OR in Matrix 贪心
B. OR in Matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/probl ...
- 2015南阳CCPC C - The Battle of Chibi DP
C - The Battle of Chibi Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Cao Cao made up a ...
- MyBatis之三:多表联合查询
在这篇文章里面主要讲解如何在mybatis里面使用一对一.一对多.多表联合查询(类似视图)操作的例子. 注:阅读本文前请先大概看一下之前两篇文章. 一.表结构 班级表class,学生表student, ...
- delphi res 字符串资源
delphi res 字符串资源 (2011/12/10 19:19:36) //res 字符串资源 //rc 文件:StringTablebegin0 "AAAA"1 " ...
- Android Activity界面切换添加动画特效
在Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入, @Override pub ...
- sublime php语法检查
安装sublimelinter 安装sublimelinter-php 设置sublimelinter 进入SublimeLinter文件夹改动 SublimeLinter.sublime-setti ...
- 第1章 游戏之乐——NIM(2)“拈”游戏分析
NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...
- Windows Service 之 安装失败后的删除
一个windows服务在卸载之后并不会马上从服务列表中消失掉,而是在服务列表中会显示服务被禁用:这样在你需要再次安装同名服务时,就装不了了,会被提示同名的服务已经存在.如果是在本地安装,这种情况很容易 ...