15.析构函数
2016-07-18 16:16
363 查看
析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字deinit来标示.
子类继承了父类的析构器,并且在子类析构器实现的最后,父类的析构器会被自动调用。
即使子类没有提供自己的析构器,父类的析构器也同样会被调用。
因为直到实例的析构器被调用后,实例才会被释放,所以析构器可以访问实例的所有属性。
语法:在类的定义中,每个类最多只能有一个析构器,而且析构器不带任何参数。
1.析构过程
析构器是在实例释放发生前被自动调用。子类继承了父类的析构器,并且在子类析构器实现的最后,父类的析构器会被自动调用。
即使子类没有提供自己的析构器,父类的析构器也同样会被调用。
因为直到实例的析构器被调用后,实例才会被释放,所以析构器可以访问实例的所有属性。
语法:在类的定义中,每个类最多只能有一个析构器,而且析构器不带任何参数。
deinit { //执行析构过程 }
2.示例
//Bank类管理一种虚拟硬币,确保流通的硬币数量永远不可能超过 10,000。在游戏中有且只能有一个Bank存在 class Bank { static var coinsInBank = 10000; static func vendCoins(numberOfCoinsToVend: Int) -> Int { let retValue = min(numberOfCoinsToVend, coinsInBank); coinsInBank -= retValue; return retValue; } 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); print("Player have \(playerOne!.coinsInPurse) coins, Bank have \(Bank.coinsInBank)"); //"Player have 100 coins, Bank have 9900\n" playerOne?.winCoins(2000); print("Player have \(playerOne!.coinsInPurse) coins, Bank have \(Bank.coinsInBank)"); //"Player have 2100 coins, Bank have 7900\n" playerOne = nil; print("Player have \(playerOne?.coinsInPurse) coins, Bank have \(Bank.coinsInBank)"); //"Player have nil coins, Bank have 10000\n"
相关文章推荐
- C/C++ 静态链接库(.a) 与 动态链接库(.so)
- 每天一个linux命令(53)--ps命令
- 简单判断是否是微信打开页面代码
- ES
- Android发送验证码倒计时
- 多线程Java
- Mac OS X窗口最小化方法的几个快捷键
- Hibernate总结(一)--之hibernate配置文件
- java格式化时间到毫秒
- [poj 2001]Shortest Prefixes [Trie]
- cookie 和session 的区别详解
- 常用Linux命令
- 复制”链接文件“到虚拟机(VirtualBox)的”共享文件夹“时报错:创建符号链接时报错:只读文件系统
- 《UNIX环境高级编程第三版》apue.h等源码文件的编译安装
- nltk官方学习资料
- python正则表达式--基本用法和函数(理论知识)
- 学习笔记-斯坦福iOS7-第十一课:表格视图和iPad
- 8张图理解Java
- [kuangbin带我飞]数位DP F(x)
- 在masm下编译一个较小的PE文件