★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9739382.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

一个deinitializer一个类的实例被释放之前立即调用。您使用deinit关键字编写deinitializers ,类似于使用init关键字编写初始化程序的方式。Deinitializers仅适用于班级类型。

取消初始化如何运作

当不再需要实例时,Swift会自动释放您的实例,以释放资源。迅速通过处理实例的存储器管理自动引用计数ARC),如在自动引用计数。通常,在取消分配实例时,您无需执行手动清理。但是,当您使用自己的资源时,可能需要自己执行一些额外的清理。例如,如果创建自定义类以打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭该文件。

类定义每个类最多可以有一个deinitializer。deinitializer不接受任何参数,并且没有括号写入:

  1. deinit {
  2. // perform the deinitialization
  3. }

在实例解除分配之前,会自动调用取消初始化程序。您不能自己致电deinitializer。超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用。即使子类不提供自己的deinitializer,也始终调用超类deinitializers。

因为实例在调用deinitializer之后才被释放,所以deinitializer可以访问调用它的实例的所有属性,并可以根据这些属性修改其行为(例如查找需要关闭的文件的名称) )。

Deinitializers in Action

这是一个取消初始化的例子。这个例子定义了两种新类型,Bank并且Player,对于一个简单的游戏。该Bank班级管理一种虚拟货币,其流通量永远不会超过10,000个。Bank游戏中只能有一个,因此它Bank被实现为具有类型属性和类的类来存储和管理其当前状态:

  1. class Bank {
  2. static var coinsInBank = 10_000
  3. static func distribute(coins numberOfCoinsRequested: Int) -> Int {
  4. let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
  5. coinsInBank -= numberOfCoinsToVend
  6. return numberOfCoinsToVend
  7. }
  8. static func receive(coins: Int) {
  9. coinsInBank += coins
  10. }
  11. }

Bank跟踪其拥有的当前硬币数量coinsInBank。它还提供两种方法 - distribute(coins:)以及receive(coins:)- 处理硬币的分配和收集。

distribute(coins:)方法在分发之前检查银行中是否有足够的硬币。如果没有足够的硬币,则Bank返回的数字小于请求的数字(如果银行中没有剩余硬币,则返回零)。它返回一个整数值,表示提供的实际硬币数。

receive(coins:)方法简单地将收到的硬币数量添加回银行的硬币商店。

Player课程描述了游戏中的玩家。每个玩家在任何时候都有一定数量的硬币存放在他们的钱包里。这由玩家的coinsInPurse财产代表:

  1. class Player {
  2. var coinsInPurse: Int
  3. init(coins: Int) {
  4. coinsInPurse = Bank.distribute(coins: coins)
  5. }
  6. func win(coins: Int) {
  7. coinsInPurse += Bank.distribute(coins: coins)
  8. }
  9. deinit {
  10. Bank.receive(coins: coinsInPurse)
  11. }
  12. }

Player在初始化期间,每个实例初始化具有来自银行的指定数量的硬币的起始许可,但是Player如果没有足够的硬币可用,则实例可以接收少于该数量的实例。

Player类定义了一个win(coins:)方法,它获取一定数量从银行硬币,并将它们添加到玩家的钱包。该Player班还实现了deinitializer,这被称为之前Player实例被释放。在这里,deinitializer只是将所有玩家的硬币归还给银行:

  1. var playerOne: Player? = Player(coins: 100)
  2. print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
  3. // Prints "A new player has joined the game with 100 coins"
  4. print("There are now \(Bank.coinsInBank) coins left in the bank")
  5. // Prints "There are now 9900 coins left in the bank"

Player创建一个新实例,如果可用则请求100个硬币。此Player实例存储在Player名为的可选变量中playerOne。这里使用可选变量,因为玩家可以随时离开游戏。可选项可让您跟踪游戏中当前是否有玩家。

因为playerOne它是可选的,!coinsInPurse访问其属性以打印其默认硬币数时,无论何时win(coins:)调用其方法,它都会被感叹号()限定:

  1. playerOne!.win(coins: 2_000)
  2. print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
  3. // Prints "PlayerOne won 2000 coins & now has 2100 coins"
  4. print("The bank now only has \(Bank.coinsInBank) coins left")
  5. // Prints "The bank now only has 7900 coins left"

在这里,玩家赢得了2,000个硬币。玩家的钱包现在包含2,100个硬币,银行只剩下7,900个硬币。

  1. playerOne = nil
  2. print("PlayerOne has left the game")
  3. // Prints "PlayerOne has left the game"
  4. print("The bank now has \(Bank.coinsInBank) coins")
  5. // Prints "The bank now has 10000 coins"

玩家现在已离开游戏。这通过将可选playerOne变量设置为表示nil“无Player实例” 来指示。在发生这种情况时,playerOne变量对Player实例的引用被破坏。没有其他属性或变量仍然引用该Player实例,因此它被释放以释放其内存。就在这种情况发生之前,它的自动调节器会自动调用,并将其硬币返还给银行。

转载于:https://www.cnblogs.com/strengthen/p/9739382.html

Swift5.1 语言指南(十七) 反初始化相关推荐

  1. Swift5.1 语言指南(三) 快速之旅

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. Swift5.1 语言指南(一) 关于Swift

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  3. Swift5.1 语言指南(九) 闭包

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  4. Swift5.1 语言指南(二十三) 协议

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  5. Swift5.1 语言指南(二十) 类型转换

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. Swift5.1 语言指南(十三) 方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. Swift语言指南(十)--字符串与字符

    原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String ...

  8. 独立式环境与宿主式环境————《标准C语言指南》读书笔记01

    独立式环境与宿主式环境----<标准C语言指南>读书笔记01 在编写和转换一个C程序之前,需要考虑它的执行环境,因为这关系到源文件的内容(程序应当如何编写),也关系到转换后的程序能否正常执 ...

  9. Swift语言指南(二)--语言基础之注释和分号

    Swift语言指南(二)--语言基础之注释和分号 原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时 ...

  10. Swift语言指南(一)--语言基础之常量和变量

    原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(三):linux平台的信号、程序崩溃处理
  2. P1063 能量项链
  3. 利用正则表达式去除所有html标签,只保留文字
  4. 虚拟机登服务器,用虚拟机登录云服务器
  5. oracle 11g goldengate与oracle 11g数据同步
  6. NOTEPAD大神是否鄙视一切IDE?
  7. Java 算法 超级玛丽
  8. nodejs参数的接收(post和get)
  9. 原因为 1.无法找到文档; 2. 无法读取文档; 3. 文档的根元素不是xsd:schema
  10. python字典添加主键_字典的常见操作
  11. Unity3D 与udk 3D游戏动漫引擎的开发特点
  12. Axure RP 9.0 软件安装教程
  13. DIY 3D打印机测试
  14. Sketch教程|如何访问组件视图?
  15. 毕业设计之 --- 新闻分类系统
  16. html5黄油,天才黄油有油无油区别 天才黄油的正确用法
  17. 中兴--维克多博士问题(背包问题升级版)
  18. Rabbitmq 基础
  19. 雷电网络:前景,挑战,路线
  20. 大漠插件最新版7.2248

热门文章

  1. net.java.html.boot.BrowserBuilder
  2. HP LINUX打印机驱动安装步骤
  3. WIN10显示汉字都有问题?
  4. error LNK2005: DllMain 已经在MSVCRT.lib中定义
  5. C#中获得窗体的句柄
  6. LINUX编译OPENJDK:The tested endian intarget (big) differs from the endian expected to be found in the
  7. 银河麒麟双击deb包无法安装
  8. 连文件搜索都不会用,也不自己反省一下?
  9. php curl 缓存请求_PHP异步非阻塞实现方法
  10. VC++字符串类型转换