十四、析构器 Deinitialization

1. 当一个实例被释放(deallocated)时,析构器会立即被调用。使用关键字 deinit 来定义析构器。只有类类型才有析构器。

2. 析构器工作原理 How Deinitialization Works

当一个实例的自动引用计数 Automatic Reference Counting 为0时,Swift会释放这个实例。一般情况下,当一个实例被dealloc时,释放资源的工作都有Swift完成,但是某些时候,你需要自己进行一些释放资源的工作,比如你创建一个类执行打开文件操作,并写数据到文件中,在实例被dealloc时,你需要关闭文件。

    deinit {
      // perform the deinitialization
    }

析构器是编译器自动调用的,你不能手动调用。父类的析构器会被子类继承,当子类的析构器被调用时,父类的析构器会自动被调用。即使子类没有提供自己的析构器,父类的析构器也会被调用。
析构器可以访问调用它的实例的所有属性和方法。

例子:

    struct Bank {
      static var coinsInBank = 10_000 //剩下的硬币
      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)
    println("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
    // prints "A new player has joined the game with 100 coins"
    println("There are now \(Bank.coinsInBank) coins left in the bank")
    // prints "There are now 9900 coins left in the bank"
    playerOne!.winCoins(2_000)
    println("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
    // prints "PlayerOne won 2000 coins & now has 2100 coins"
    println("The bank now only has \(Bank.coinsInBank) coins left")
    // prints "The bank now only has 7900 coins left"
    playerOne = nil
    println("PlayerOne has left the game")
    // prints "PlayerOne has left the game"
    println("The bank now has \(Bank.coinsInBank) coins")
    // prints "The bank now has 10000 coins"

参考:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html#//apple_ref/doc/uid/TP40014097-CH19-ID142

时间: 2024-10-05 22:29:37

十四、析构器 Deinitialization的相关文章

Struts2(十四)拦截器实现权限管理

一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截Action请求 在访问的Action执行之前和执行之后执行代码实现某项功能 Struts2: 大部分功能是在拦截器中实现的如:接收输入的参数,数据验证,文件上传,国际化等 应用程序: 需要在Action执行的前后执行特定功能 Action执行时间统计,Action访问权限管理 Action添加功能

十四 —— 装饰器

设置类属性 1.@property装饰器,是python内置的装饰器,可以把类的方法伪装成属性调用的方式, 2.python内置的builtins模块中的property()函数 property(get_age, set_age, del_age, "年龄"):前面三个参数是方法名.调用时自动执行的方法,最后一个参数是个字符串,他用来做描述 原文地址:https://www.cnblogs.com/KeenaCherry/p/12110212.html

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

C#编程总结(十四)dynamic

C#编程总结(十四)dynamic 介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像具有类型 object 一样. 在编译时,将假定类型化为 dynamic 的元素支持任何操作. 因此,您不必考虑对象是从 COM API.从动态语言(例如 IronPython).从 HTML 文档对象模型 (DOM).从反射还是从程序中的其他位置获取自己的值. 但是,如果代码无效,则在运行

十四、mysql 分区之 HASH && KEY

1.hash分区 PS::个人觉得HASH分区很好很强大,简单确分布极其均匀 创建实例: CREATE TABLE HASH_EMP ( tid int, tname char(255) ) PARTITION BY HASH (tid) PARTITIONS 8; 将hash_emp进行的tid进行hash分区,并分为8个区 查询分区的数据分布情况: select partition_name,partition_expression,partition_description,table_r

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

如鹏网学习笔记(十四)ASP.NET

Asp.net笔记 一.Socket类 进行网络编程的类,可以在两台计算机之间进行网络通讯 过程: 向服务器发送指令: GET /index.html HTTP/1.1 Host:127.0.0.1:8080 回车空行 二.浏览器是什么 浏览器就是一个Socket网络客户端,帮助用户请求网站服务器上的内容并且将返回的内容渲染为图形化内容 浏览器的过程: 用户在浏览器输入网址,浏览器向DNS服务器发出Socket请求, 服务器把请求的内容返回给浏览器, 浏览器将内容进行解析并渲染绘制成页面展现,

[WebGL入门]十四,绘制多边形

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 这是本次的demo的运行结果 绘制流程 这次终于该绘制多边形了,之前的文章(十一,着色器的编译和连接)中介绍了HTML,顶点着色器和片段着色器,这次看一下javascript从开始到最终的全部处理.如果前两篇文章介绍的内容完全理解的话,这次的内容也应该不难了.或许会有不容易理解的地方,不要着急

第三百二十四节,web爬虫,scrapy模块介绍与使用

第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy 使用了 Twisted异步网络库来处理网络通讯.