析构过程

析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字deinit来标示,类似于构造器要用init来标示。

原理

Swift 会自动释放不再需要的实例以释放资源,Swift 通过自动引用计数(ARC)处理实例的内存管理。通常当你的实例被释放时不需要手动地去清理。但是,当使用自己的资源时,你可能需要进行一些额外的清理。例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前手动去关闭该文件。

  1. deinit {
  2. // 在这里实现析构过程
  3. }

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

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

操作演示

  1. // 游戏币中心 结构体
  2. struct Bank {
  3. static var coinsInBank = 10_000 // 虚拟游戏币
  4.  
  5. // 出售游戏币
  6. static func vendCoins(numberOfCoinsToVend: Int) -> Int {
  7. let coinsToVend = min(numberOfCoinsToVend, coinsInBank)
  8. coinsInBank -= coinsToVend
  9. return numberOfCoinsToVend
  10. }
  11.  
  12. // 回收游戏币
  13. static func receiveCoins(coins: Int) {
  14. coinsInBank += coins
  15. }
  16. }
  17.  
  18. // 玩家类
  19. class Player {
  20. var coinsInPurse: Int
  21. init(coins: Int) {
  22. // 构造方法中调用了Bank的类型方法,来获得游戏币,并且数量控制在10,000以内。
  23. coinsInPurse = Bank.vendCoins(coins)
  24. }
  25.  
  26. func winCoins(coins: Int) {
  27. // 赢得游戏币方法,从Bank中获得游戏币
  28. coinsInPurse += Bank.vendCoins(coins)
  29. }
  30.  
  31. deinit {
  32. // 当玩家被释放时需要将所有游戏币归还到Bank
  33. Bank.receiveCoins(coinsInPurse)
  34. }
  35. }
  36.  
  37. // 这里将playerOne设置为可选属性,因为playerOne随时会被制为nil
  38. var playerOne: Player? = Player(coins: 3000)
  39.  
  40. // player 3000 Bank 7000
  41. print("playerOne coins:\(playerOne!.coinsInPurse), Bank coins: \(Bank.coinsInBank)")
  42.  
  43. playerOne?.winCoins(500)
  44.  
  45. // player 3500 Bank 6500
  46. print("playerOne coins:\(playerOne!.coinsInPurse), Bank coins: \(Bank.coinsInBank)")
  47.  
  48. // 将playerOne制为空,没有任何引用指向playerOne内存,ARC机制会自动释放这块内存,deinit方法被调用,归还游戏币
  49. playerOne = nil
  50.  
  51. // Bank 10000
  52. print("Bank coins: \(Bank.coinsInBank)")

学习Swift -- 析构过程的更多相关文章

  1. Swift 析构过程

    在一个类的实例被释放之前,析构函数被立即调用.用关键字deinit来标示析构函数,类似于初始化函数用init来标示.析构函数只适用于类类型. 析构过程原理 Swift 会自动释放不再需要的实例以释放资 ...

  2. swift学习笔记之-析构过程

    //析构过程deist import UIKit /*析构过程(Deinitialization):析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示 ...

  3. swift 学习- 17 -- 析构器

    // 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...

  4. Swift的构造和析构过程

    构造过程 Swift的构造过程通过定义构造器来实现. 只是与Objective-C不同的是,Swift的构造器不须要返回值,相同也不须要表明Func. 另外值得提的是,当构造器中为存储型属性赋值时.不 ...

  5. ios -- 教你如何轻松学习Swift语法(二)

    前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦.      一.可选类型(重点内容)   1.什么是可选类型?        1.1在OC开 ...

  6. Swift2.1 语法指南——析构过程

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  7. Swift 析构器deinit

    析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标识,类似于构造器用init来标识. 原理: Swift会自动释放不再需要的实例以释放资源.Swift通 ...

  8. 一步一步学习Swift之(二):好玩的工具playground与swfit基础语法

    playground好于在于能一边写代码一边看到输出的常量变量的值.不需要运行模拟器. 我们来试一下该工具的用法. 打开xcode6开发工具,选择Get started with a playgrou ...

  9. 我在开发第一个Swift App过程中学到的四件事

    本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/ 译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Sw ...

随机推荐

  1. 更改Sublimetext3的主题文件,改变某些不喜欢的颜色

    使用的主题是Monokai(SL),主题很好看,但是注释和内容选中的颜色看起来跟没有一个样,看起来很淡,所以稍微改一下主题文件的颜色.

  2. SQL SERVER 中如何将NULL转换为0

    select isnull(fieldname,0) from tablename 如果字段fieldname的值是null,则结果是0

  3. 基于单个 div 的 CSS 画图

    原文: Single Div Drawings with CSS 译文: 基于单个 div 的 CSS 画图 译者: 前端外刊评论 译注:通读本文,强烈地感受到了技术与艺术的结合.赞作者的这句话:Re ...

  4. bash if 表达式

    .bash把[[ $a -lt $b ]]看作一个单独的元素,并且返回一个退出码.退出码0为真,非零为假 例如: a= b=c [[ $a -lt $b ]] echo $? # a小于b为真 [[ ...

  5. \n 与 \r

    符号 ASCII码 意义 \n 换行NL \r 回车CR 回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return 换行 \n 本义是光标往 ...

  6. gson使用详解

    昨天读一篇文章,看到gson这个词,一开始还以为作者写错了,问了度娘之后才发现是我才疏学浅,于是大概了解了一下gson用法,总体来说还是很简单的. Gson.jar下载 JavaBean转json / ...

  7. VC++文件相关操作的函数封装实现

    在开发编译工具中,需要用到文件的相关操作,于是就封装了相关的函数实现: //判断文件是否存在 BOOL FileIsExist(CString strFileName) { CFileFind fin ...

  8. ASP.NET中如何实现负载均衡

    ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一,做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同 ...

  9. Android(java)学习笔记191:Android数据存储5种方式总结

    1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...

  10. javascript中的函数返回值(return)

    有些情况,我们希望获取到函数的执行结果,也就是我们需要在函数以外的地方处理执行结果,而不是在函数内部处理.这时我们就需要为函数设一个返回值,也就是return,即函数执行完毕以后返回的结果. 若在函数 ...