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内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个 ...
随机推荐
- UVa532 Dungeon Master 三维迷宫
学习点: scanf可以自动过滤空行 搜索时要先判断是否越界(L R C),再判断其他条件是否满足 bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时) #i ...
- TOJ 4325 RMQ with Shifts / 线段树单点更新
RMQ with Shifts 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 In the traditional RMQ (Range M ...
- mysql 5.6 原生Online DDL解析
http://seanlook.com/2016/05/24/mysql-online-ddl-concept/ 做MySQL的都知道,数据库操作里面,DDL操作(比如CREATE,DROP,ALTE ...
- iOS strong 和weak的形象理解
转自:http://hi.baidu.com/phone_lwc/item/c36e5bfe1cf9c313ce9f32be 觉得讲的很容易理解 The difference is that an o ...
- SIGGRAPH 2014 之行
当地时间8月8号: 经历十个多小时的飞行,在紧急出口旁的位置上忍受发动机的轰鸣声后,顺利降落温哥华机场.回答完加拿大边检的几个诸如为何而来,打算住哪儿的问题后,比较顺利出关.三十五加元的打车费及百分十 ...
- debian分区方案(就这个看着靠谱点)转
debian分区方案(就这个看着靠谱点)转 桌面系统/tmp 1G (仅用作临时文件) ext3/ext4/home Max (用户目录数据) ext3/ext4/usr 20G (软件) ext3/ ...
- php技术概要汇总
php搜索-> sphinx coreseek : 中文分词.中文搜索 samba :把linux服务器端目录映射的本地. 视频截图插件.音频视频转换(ffmpeg): 1)w ...
- Helpers\RainCaptcha
Helpers\RainCaptcha This class can validate CAPTCHA images with RainCaptcha. It can generate an URL ...
- JMeter 学习笔记从不懂慢慢提升(01)
开源已经成为一个趋势,虽然说做测试是一个低端的行业,但是我们也应该在这个低端的行业慢慢提升自己,让自己到达理想的高度. 以前说如果你会使用loadrunner可能别人就会觉得你有一定的水平那么就会拿高 ...
- webservice发布接口
一:编写接口程序,计算功能类,有加减乘除四个方法 /** * */ package com.hlcui.util; /** * @author Administrator 将此类发布为公共接口 */ ...