Swift 析构器deinit
析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字deinit来标识,类似于构造器用init来标识。
原理:
Swift会自动释放不再需要的实例以释放资源。Swift通过自动引用计数ARC处理实例的内存管理。通常当你的实例被释放时,不需要手动地 进行清理。但是,当使用自己的资源时,你可能需要进行一些额外的清理。例如:如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实 例被释放之前手动去关闭该文件。
在类的定义中,每个类最多只能有一个析构器,而且析构器不带任何参数:
1
2
3
|
deinit { //执行析构过程 } |
析构器在实例释放之前被自动调用,析构器是不允许被主动调用的。子类继承了父类的析构器,并且在子类析构器实现的最后,父类的析构器会被自动调用。即使子类没有提供自己的析构器,父类的析构器也同样会被调用。
因为知道实例的析构器被调用时,实例才会被释放。所以析构器可以访问所有请求实例的属性,并且根据那些属性可以修改它的行为。比如查找一个需要被关闭的文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
struct Bank { static var coinsInBank = 10000 static func vendCoins ( var numberOfCoinsToVend : Int ) - > Int { numberOfCoinsToVend = min ( numberOfCoinsToVend , coinsInBank ) coinsInBank -= numberOfCoinsToVend return numberOfCoinsToVend } static func receiveCoins ( coins : Int ){ coinsInBank += coins } } class Player { var coinsInPurse : Int init ( coins : Int ){ coinsInPurse = Bank . vendCoins ( coins ) } func winCoins ( coins : Int ){ coinsInPurse += Bank . vendCoins ( coins ) } deinit { Bank . receiveCoins ( coinsInPurse ) } } var playerOne : Player ? = Player ( coins : 100 ) print ( playerOne !. coinsInPurse ) print ( Bank . coinsInBank ) playerOne !. winCoins ( 1000 ) print ( playerOne !. coinsInPurse ) print ( Bank . coinsInBank ) playerOne = nil print ( Bank . coinsInBank ) 100 9900 1100 8900 10000 |
playerOne是可选的,所以要用一个感叹号!来做修饰符。
当playerOne是nil时,意思是不存在Player实例,当这种情况发生时,playerOne变量对Player实例的引用被破坏 了。没有其他属性或者变量引用Player实例,因此为了清空它占用的内存从而释放它。在这发生前,其析构器会被自动调用,从而使其硬币被返回到bank 对象中。
Swift 析构器deinit的更多相关文章
- Swift构造器(Initializer)与析构器(Deinitializer)
为了初始化结构体和类等类型的实例属性. 默认构造器 struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } } ...
- Swift中子类必须包含的构造器和析构器
import Foundation /* Swift中子类必须包含的构造器 1.Swift允许在父类构造器前添加required关键字, 用于声明所有子类必须包含该required构造器 (如果没有声 ...
- swift 学习- 17 -- 析构器
// 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...
- Swift-07-析构器deinit
析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标识,类似于构造器用init来标识. 原理: Swift会自动释放不再需要的实例以释放资源.Swift通 ...
- 学习Swift -- 析构过程
析构过程 析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示,类似于构造器要用init来标示. 原理 Swift 会自动释放不再需要的实例以释放资源, ...
- objective-C学习笔记(五)函数成员:初始化器和析构器
初始化器:init 对象初始化器: -(id)init 可以重载多个. 类型初始化器: +(id)initialize只能有一个. 对象初始化器: 初始化对象实例时,init通常和alloc(手动内存 ...
- 一段程序的分析——C++析构器,何时析构
最近在看小甲鱼的视频,有段程序是这么写的: #include <iostream> #include <string> class Pet { public: Pet(std: ...
- 析构方法 deinit
/* 析构方法: 对象的内存被回收前被隐式调用的方法, 对应OC的dealloc方法 主要执行一些额外操作, 例如释放一些持有资源, 关闭文件, 断开网络等 */ class FileHandle { ...
- Python构造器及析构器:__init__与__new__及__del__
__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__.__new__是负责实例化对象的,而__ ...
随机推荐
- Array 原型扩展(快速排序,搅乱顺序)
/// 快速快速排序算法Array.prototype.quickSort = function (left, right) { // left = left || 0; // right = rig ...
- poj 1284 Primitive Roots
从来没有接触过完全剩余系,不会证明,知道看了别人的题解才知道要用欧拉函数: 下面是证明过程: p是奇素数,如果{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1 ...
- IE连EXCHANGE的HTTPS时,出现错误
"There is a problem with this website's security certificate" 这种问题,一般是SSL或CA认证证书的问题. 一般从服务 ...
- ANDROID_MARS学习笔记_S05_005_方向传感器
import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import ...
- 好看的UI设计网站 www.ui.cn 和 插画网站 www.pixiv.net 千图网,界面很不错~
http://www.ui.cn/?t=share#project http://www.pixiv.net/ http://www.flaticon.com/ www.58pic.com 那张 给人 ...
- java.lang.String内部结构的变化
原文:http://java-performance.info/changes-to-string-java-1-7-0_06/ 作者:Mikhail Vorontsov IMPORTANT: Jav ...
- bzoj3669
不难想到从小到大穷举a,判断在携带不超过a个B型精灵的情况下最少携带多少个B型精灵这是一个经典的问题,显然要求出最小生成树,树上1到N路径上最大的边即是答案所以我们要动态维护一个最小生成树可以用lin ...
- Android4.0 -- UI控件之 Menu 菜单的的使用(四)
2. PopupMenu 菜单的使用 1) PopupMenu 介绍 创建弹出菜单,它一般会在view的上边或者下边弹出菜单[具体看是否有空间],注意弹出菜单是api在11或者更高版本中使用 ...
- 【数据结构】之二叉树的java实现
转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...
- RatingBar设置显示星星个数
RatingBar评分控件 项目中遇到问题 marker一下: 关于自定义以及遇到的出现模糊情况 多半是因为切得图除颜色外 不一致的原因 如果大小也不一样,(沃日) 问题是这样的: 我可以通过OnRa ...