iOS Swift No.15 - 析构

本文介绍了Swift中的析构过程,自动引用计数如何管理内存,以及如何在析构器中进行手动清理工作。析构器在类实例被释放前自动调用,用于释放资源。文章通过Bank和Player类的例子,展示了析构器在实际应用中的作用,如在Player析构时将硬币返回银行。
摘要由CSDN通过智能技术生成

第十五章 析构

析构(deinitialization)是一个对类的实例释放的一个过程,在析构的过程中我们会调用析构器(deinitializer)来参与类实例的释放,析构器只有在某个类的实例被释放前才会被调用。我们用deinit关键字介绍并引出这个这个析构器,这一点和构造过程中调用的构造器的用法写法是一样的。并且析构器只能在类的实例中使用。

1. How Deinitialization Works (析构的过程)

swift可以对不在需要的实例进行释放,释放不在使用的资源,通过自动引用计数(Automatic Reference Counting)对实例的内存进行管理。总的来说,我们不需要手动做实例释放的清理工作。这个自动引用计数将会在后面的章节中详细介绍。

如果我们要使用我们自己的资源的时候,可能要手动执行某些附加的清理工作。举个例子,如果创建来一个自定义的类,这个类要打开一个文件并且要做一些数据写入的工作,这个时候我们可能要在这个类的实例被释放前关闭这个已打开的文件。

类的定义里面最多且只能有一个析构器。而且这个析构器不能带有任何参数的。

deinit {
   
    // perform the deinitialization
}

析构器的调用是自动的,它在类的实例被执行释放之前。所以我们不用去刻意的调用某个类的析构器。除非这个析构器是我们为某个类要特殊执行某个任务而自定义的析构器。子类会继承父类的析构器,并且父类的析构器会在子类最后的析构器的实现里面会被调用。即便是子类里面并备有提供析构器,父类的析构器总是会最后被调用的。

最后呢,因为实例的析构器被调用后,实例才会被完全释放(清理-内存管理)。所以说,一个析构器可以访问读取实例的所有属性,并且可以基于这些属性析构器还可以修改它的行文(查找一个需要被关闭的文件)。

Deinitializer in Action (实践中的析构器)

下面是实践中的析构器的案例,定义来两个新的类型(Bank和Player的类),class Bank是一个管理虚拟(made-up)的硬币,这个货币的在总量上也绝不会超过10,000个。在这个游戏里面只有一个类Bank,所以呢Bank作为一个类在实现的过程中,用类型属性(type property:define value that are universal to the type ) 和类型方法(type method:define methods that are called on the type itself ) 来管理和储存这些硬币的状态。

下面定义的类Bank要随时跟踪一个类型属性coinsInBank里面现有硬币的数量。和两个类型方法distribute(coins: )receive(coins: )来管理现有硬币的分配与收集。其中这个distribute(coins: )类型方法会检查要分配的硬币(numberOfCoinsRequested)和银行现有的硬币(coinsInBank),如果说没用足够的硬币,那么这时候类Bank就回返回一个比需要分配的数量还要少的数量。receive(coins: )这个方法是用来收集硬币来添加到coinsInBank属性里面的。


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值