Swift-析构过程(Deinitialization)(十三)

前言

析构器用于类类型(class),当一个类的实例被释放前,析构器会被立即调用,析构器用关键字deinit来标识,类似于构造器要用init来标识。
- 析构过程原理
- 析构器操作

分条详述

  1. 析构过程原理
    Swift会自动释放不再需要的实例以释放资源,通常代码中实例被释放时不需要手动的去清理。当时当自己管理一些资源的时候,可能就需要一些额外的清理。例如,如果创建一个自定义的类来打开一个文件,并写入数据,那么可能就需要在实例被释放之前手动关闭该文件。

    在类的定义中,每个类最多只能有一个析构器,而且析构器不带任何参数,如下:

deinit {
        //  执行析构过程
    }

析构器在实例释放前被自动调用。析构器是不允许被动调用的。子类继承了父类的析构器,并且在子类析构器实现的最后,父类的析构器会被自动调用。即使子类没有提供自己的析构器,父类的析构器同样会被调用。

因为知道实例的析构器被调用时,实例才会被释放,所以析构器可以访问所有请求实例的属性,并且根据那些属性可以修改他们的行为,比如查找一个需要被关闭的文件等。

  1. 析构器操作
    教材中提供了一个具体的例子讲解析构操作。自己也就在理解的基础上手动复制一遍吧,这个例子挺好的。一个简单的小游戏,定义BankPlayer两个类型。Bank结构体管理虚拟货币的流通,流通过程中Bank中永远不可能有超过10000的金币,并且游戏中有且仅有一个Bank。因此,Bank结构体在实现时会带有静态属性和静态方法来存储和管理当前的状态(静态方法和静态属性类似Objective-C中的类方法,类型名.Paramters 名即可调用)。Player结构体存储玩家信息和对应操作方法。每一个Player在任何时刻都有一定数量的硬币存储在他们的钱包里。
//  银行结构体,管理虚拟货币的流通
struct Bank {
    static var coinsInBank = 10_000      //  单次取出金币最大限额
    //  金币分发
    static func vendCoins(numberOfCoinsToVend number: Int) -> Int {
        let rightNumer = min(coinsInBank, number) //  不能超过最大限额
        //  剩余金币数
        coinsInBank -= rightNumer
        return rightNumer
    }
    //  金币收集
    static func receiveCoins(receiveCoinsNumber number: Int) {
        coinsInBank += number
    }
}
//  玩家信息,类类型
class Player {
    var coinsInPurse: Int       //  钱包中金币数量
    init(coins: Int) {
        //  钱包中金币初始数量,从虚拟银行获取
        coinsInPurse = Bank.vendCoins(numberOfCoinsToVend: 100)
    }
    // 收集金币
    func winCoins(coins: Int) {
        coinsInPurse += Bank.vendCoins(numberOfCoinsToVend: coins)
    }
    //  析构器,游戏结束,收集到的金币放入 Bank
    deinit {
        Bank.receiveCoins(receiveCoinsNumber: coinsInPurse)
    }
}
//  由于玩家可以随时离开游戏,将玩家设置可选类型。设置为可选也可追踪当前是否有玩家在游戏中。
//  玩家创建角色时有100的初始金币(如果虚拟货币足够的话)
var playerOne: Player? = Player(coins: 100)
playerOne?.winCoins(2000)      //  赢得2000金币,此时查看虚拟货币剩余数量和钱包内金币数量
playerOne?.coinsInPurse         //  2100
Bank.coinsInBank          //  7900
//  调用析构器
playerOne = nil
playerOne?.coinsInPurse        //  nil
Bank.coinsInBank       //  10_000

主要的描述都写在注释里了,主要展示了析构器的用法和调用时间。

结束语

这小节和上小节真的天壤之别啊,本来想和下小节合到一起的,想想还是算了,有挠头的时候,也要有轻松的时候啊。

真想快点结束,然后把记得的知识写个大点的demo,干巴巴的看语言好没意思。

Swift-析构过程(Deinitialization)(十三)_第1张图片

你可能感兴趣的:(swift,deinit,析构过程)