具体而言,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**的发展过程中采用了自动引用计数(ARC)来简化内存管理,并在Foundation和Cocoa框架基础上构建了一套标准化的框架栈。 - **Swift**的诞生得益于Objective-C对块、集合语法和模块的支持,这些特性使得...
2. **高级主题深入**:涵盖内存管理、多线程、网络编程等复杂主题。 3. **最佳实践和编码规范**:指导开发者写出高效、可维护的代码。 4. **示例代码和项目**:通过实际案例演示语言特性和API的使用。 5. **错误处理...
- **类与结构体**:类和结构体都是定义自定义类型的手段,但它们在内存管理上有区别。 - **初始化**:类和结构体都需要定义初始化方法来设置初始状态。 - **属性**:用于存储类或结构体的值。 - **方法**:定义...
8. **性能优化**:iOS开发中,性能优化是一个重要的话题,可能包括内存管理、算法优化、多线程等。 9. **测试与调试**:单元测试、集成测试和Xcode的调试工具是保证代码质量的关键,可能有专门的环节讲解如何高效地...
此外,本书还会讲解如何利用GCD(Grand Central Dispatch)进行多线程编程,以及如何使用Swift Package Manager管理依赖。 最后,书中可能还会涉及一些性能优化技巧,如内存管理(ARC)、避免强制解包(force ...
- **内存管理**:讲解了Swift中的自动引用计数机制。 - **闭包与内存**:分析了闭包如何影响内存管理。 ##### 5. 编码与解码 - **概述**:简要介绍了编码与解码的重要性。 - **最小示例**:提供了一个简单的编码与...
本教程系列旨在深入讲解Swift的基础知识以及高级特性,帮助开发者从零开始掌握这个语言。 首先,Swift的特点包括简洁的语法、安全性、高性能和互操作性。它的设计目标是让编写代码更加直观和高效,同时消除C和...
此外,它还提供了自动内存管理、类型推断等功能,极大地提升了开发效率。 4. **与Objective-C的兼容性:**Swift与Objective-C之间可以实现无缝对接,这意味着开发者可以在Swift项目中直接使用Objective-C的类和方法...
本教程将深入讲解如何使用Swift实现一个类似于微信“按住说话”的录音功能。这个Demo名为"ZZJRecord-Demo-master",它提供了直观的代码示例,帮助开发者理解和实现这一常见功能。 首先,我们需要了解iOS中的音频...
本文将详细讲解如何在Swift中利用`willMoveToSuperview`方法无痛地实现KVO,以及其在Swift开发中的应用。 ### 1. KVO基本原理 KVO是Objective-C中引入的一种设计模式,它允许一个对象监听另一个对象的某个属性变化...
4. **管理定时器**:记得在不再需要定时器时取消它,以避免内存泄漏。 ```swift timer.invalidate() ``` 接下来,我们讨论无限滚动视图(CycleScrollView)。无限滚动视图通常用于展示轮播图或图片列表,用户...
本节"swift菜鸟入门视频教程-10-属性"将深入讲解Swift中的属性概念,帮助初学者更好地理解和运用这一核心特性。 属性分为两种主要类型:存储属性(Stored Properties)和计算属性(Computed Properties)。存储属性...
它的语法简洁明了,支持类型安全和内存管理,使得编写高效代码变得更加容易。 2. **3D效果**: 这个组件的核心特性是其3D效果。通过利用Core Animation框架,RSLoadingView能够创建出视觉上引人入胜的3D旋转动画,...
- **自动引用计数(ARC)** - Swift 自动管理内存的机制。 - **类型转换** - 在运行时检查和解释对象类型。 - **权限控制** - 控制代码可见性和访问级别。 #### 5. 苹果官方 Blog 翻译 苹果官方 Blog 提供了一系列...
- **内存管理**:探讨Swift中的ARC(自动引用计数)机制,以及如何避免内存泄漏。 - **性能监控**:介绍如何使用Xcode的工具来监控和分析应用的性能问题。 - **异步加载**:讲解如何实现异步加载机制,提高应用的...
Swift的内存管理是基于自动引用计数(ARC)和弱引用,确保了内存的有效利用和避免循环引用。同时,Swift还引入了“无主引用”(unowned references),以处理生命周期与对象相关的复杂情况。 本书会深入讲解Swift的...
本教程将深入讲解如何利用UICollectionView来构建一个高效、灵活的图片轮播器。 首先,UICollectionView是苹果iOS SDK中的一个强大的组件,它允许我们创建可自定义布局的、动态内容的视图。在图片轮播器的应用场景...
- **内存管理**:Swift 4中的自动引用计数(ARC)系统得到了优化,更好地支持现代编程模式。 #### 实战示例与应用场景 本书通过一系列实战示例来介绍Swift 4的应用场景,涵盖了以下几个方面: - **基本语法与数据...
它的语法简洁明了,支持类型安全和内存管理,适合快速开发。 2. **第三方登录授权**:第三方登录授权是通过用户已有的社交账号(如微信、微博、QQ或Facebook)来登录你的应用,而不是创建新的用户名和密码。这种...