学习Swift -- 析构过程

析构过程

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

原理

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

    deinit {
        // 在这里实现析构过程
    }

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

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

操作演示

// 游戏币中心 结构体
struct Bank {
    static var coinsInBank = 10_000     // 虚拟游戏币

    // 出售游戏币
    static func vendCoins(numberOfCoinsToVend: Int) -> Int {
        let coinsToVend = min(numberOfCoinsToVend, coinsInBank)
        coinsInBank -= coinsToVend
        return numberOfCoinsToVend
    }

    // 回收游戏币
    static func receiveCoins(coins: Int) {
        coinsInBank += coins
    }
}

// 玩家类
class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        // 构造方法中调用了Bank的类型方法,来获得游戏币,并且数量控制在10,000以内。
        coinsInPurse = Bank.vendCoins(coins)
    }

    func winCoins(coins: Int) {
        // 赢得游戏币方法,从Bank中获得游戏币
        coinsInPurse += Bank.vendCoins(coins)
    }

    deinit {
        // 当玩家被释放时需要将所有游戏币归还到Bank
        Bank.receiveCoins(coinsInPurse)
    }
}

// 这里将playerOne设置为可选属性,因为playerOne随时会被制为nil
var playerOne: Player? = Player(coins: 3000)

// player 3000  Bank 7000
print("playerOne coins:\(playerOne!.coinsInPurse), Bank coins: \(Bank.coinsInBank)")

playerOne?.winCoins(500)

// player 3500  Bank 6500
print("playerOne coins:\(playerOne!.coinsInPurse), Bank coins: \(Bank.coinsInBank)")

// 将playerOne制为空,没有任何引用指向playerOne内存,ARC机制会自动释放这块内存,deinit方法被调用,归还游戏币
playerOne = nil

// Bank 10000
print("Bank coins: \(Bank.coinsInBank)")
时间: 2024-10-06 15:43:36

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

Swift从零开始学习_07(UI界面实践中学习Swift)

昨天试了下写代码后感觉写比只是看好很多, 所以今天就又写了一点东西, 主要是类的属性.以及继承和xib等一些知识, 也遇到了很多麻烦, 不过好在都已经解决了, 这里简单写一下今天的代码, 有什么不对的地方了, 还是希望提出来. 先看一下做的第一个简单的页面:点击第二个按钮, 下面的视图变化颜色, 点击第一个按钮, 模态一个页面 首先是我们之前写OC代码时候在.h里面声明的一些属性, 在Swift怎么声明呢?,方法如下: var array:NSMutableArray = NSMutableAr

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

Swift 编程语言的析构过程

在一个类的实例被释放之前,析构函数被立即调用.用关键字deinit来标示析构函数,类似于初始化函数用init来标示.析构函数只适用于类类型. 析构过程原理 Swift 会自动释放不再需要的实例以释放资源.如自动引用计数那一章描述,Swift 通过自动引用计数(ARC)处理实例的内存管理.通常当你的实例被释放时不需要手动地去清理.但是,当使用自己的资源时,你可能需要进行一些额外的清理.例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前关闭该文件. 在类的定义

Swift的构造和析构过程

构造过程 Swift的构造过程通过定义构造器来实现. 不过与Objective-C不同的是,Swift的构造器不需要返回值,同样也不需要表明Func. 另外值得提的是,当构造器中为存储型属性赋值时,不会触发属性观测器. 定制化的构造过程 1. 除了默认的构造器外,我们可以通过增加参数的方式来为其添加自定义的构造函数或者叫便捷构造器(covenience initializer). 2. 构造器自动生成外部参数名,如果不希望则用"_"下划线来屏蔽掉. 3. 若属性为Optional类型的

[Swift]Day11:构造过程和析构过程

构造过程和析构过程 阶段构造 Swift 的构造过程分为两个阶段: 第一个阶段,每个存储型属性通过引入自己的构造器来设置初始值. 第二个阶段,在新实例准备使用之前进一步定制存储型属性. 安全检查 在构造的过程中, Swift 会进行四种安全检查. 安全检查 1 指定构造器必须保证它所在类引入的所有属性都必须先初始化完成,之后才能将其它构造任务向上代理给父类中的构造器. 比如下面这段代码就是错误的: class Food { var name: String init(name: String)

IOS开发语言Swift入门连载---析构过程

IOS开发语言Swift入门连载-析构过程 在一个类的实例被释放之前,析构函数被立即调用.用关键字deinit 来标示析构函数,类似于初始化函数用init 来标示.析构函数只适用于类类型. 析构过程原理 Swift会自动释放不再需要的实例以释放资源.如自动引用计数那一章描述,Swift 通过自动引用计数(ARC)处理实例的内存管理.通常当你的实例被释放时不需要手动地去清理.但是,当使用自己的资源时,你可能需要进行一些额外的清理.例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能

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

前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.可选类型(重点内容) 1.什么是可选类型? 1.1在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) 1.2在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言) 1.3但是开发中赋值nil,在所难免.因此推出了可选类型 目的:让代码更加严谨 2.可选类型的取值 可选类型要么是:空值 , 要么

析构过程

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/15_Deinitialization.html 本页包含内容: 析构过程原理 析构函数操作 在一个类的实例被释放之前,析构函数被立即调用.用关键字deinit来标示析构函数,类似于初始化函数用init来标示.析构函数只适用于类类型. 析构过程原理 Swift 会自动释放不再需要的实例以释放资源.如自动引用计数那一章描述,Swift 通过自动

进击的雨燕-------------析构过程

析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示,类似于构造器要用init来标示. 析构过程原理 Swift 会自动释放不再需要的实例以释放资源.如自动引用计数章节中所讲述,Swift 通过自动引用计数(ARC)处理实例的内存管理.通常当你的实例被释放时不需要手动地去清理.但是,当使用自己的资源时,你可能需要进行一些额外的清理.例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前手动去关闭该文件. 在类的定