美文网首页
13-Swift析构过程(Deinitialization)

13-Swift析构过程(Deinitialization)

作者: 王梓懿_1fbc | 来源:发表于2018-10-20 22:07 被阅读3次

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

一、析构过程原理


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

  • 析构器的写法。每个类最多只能有一个析构器,而且析构器不带任何参数:
deist {
  // 执行析构过程
}

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

二、析构器的示例


/** 
 模拟一个简单的游戏
 一个是管理货币的流通Bank类;
 一个是玩家类;
 */
// 结构体管理一个虚拟货币的流通
struct Bank {
    // 设定流通货币不能超过1W
    static var coinsinBank = 10_000;
    
    // 分发货币之前,检查硬币是否足够
    static func vendCoins(var numberOfCoinsToVend:Int) -> Int {
        // 求最小值
        // 例如需要100个,但实际只有50个,那么就只能发50个
        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);
    }
}

// 玩家1
// 可选类型,为了玩家可以随时离开游戏,通过可选使得可以跟踪是否有玩家在游戏
var player1:Player? = Player(coins:1_000);
print("游戏剩余货币: \(Bank.coinsinBank)");
// 赢取1W,注意player1是可选类型,要加上`!`
player1!.winCoins(1_000);
print("玩家1的货币数量: \(player1!.coinsInPurse)");
print("游戏剩余货币: \(Bank.coinsinBank)");

// 玩家2
var player2:Player? = Player(coins:500);
print("游戏剩余货币: \(Bank.coinsinBank)");

// 玩家1退出游戏,即将实例设置为`nil`
// 玩家1在退出前,有2000个
// 设置为`nil`那么player1势利将会被是释放,而此时就会调用析构器,在析构器中有一个货币回收操作
player1 = nil;
print("游戏剩余货币: \(Bank.coinsinBank)");

输出结果:
游戏剩余货币: 9000
玩家1的货币数量: 2000
游戏剩余货币: 8000
游戏剩余货币: 7500
游戏剩余货币: 9500

注:xcode7.3环境

作者:西门奄
链接:https://www.jianshu.com/u/77035eb804c3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关文章

  • 13-Swift析构过程(Deinitialization)

    析构器只适用于类,当一个类的实例被释放之前,析构器会被立即调用。析构器用deinit关键字来标示。 一、析构过程原...

  • Deinitialization (析构过程)

    Adeinitializeris called immediately before a class instan...

  • Swift 析构(Deinitialization)

    析构(Deinitialization) 当一个类的实例被回收的时候,析构器(Deinitializer)就会被调...

  • Swift学习笔记(八)--析构器与ARC

    析构(Deinitialization) 析构这一块因为ARC的原因, 所以并没有太多的代码要写, 因此也比较简单...

  • Swift5.1构造过程&析构过程

    14.构造过程 构造过程 15.构析过程 析构过程原理析构过程:析构器只适⽤于类类型,当一个类的实例被释放之前,析...

  • swift3语法(十二)

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

  • 《Swift从入门到精通》(十三):反初始化(析构过程)

    反初始化(析构过程)类实例销毁之前会立即调用析构器,用关键字 deinit 反初始化(析构过程)如何工作Swift...

  • Swift - 析构过程

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

  • 析构过程

    本页包含内容: [TOC] 析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字de...

  • 析构过程

    实例再被释放前会调用 deinit方法,类似oc中的dealloc 子类析构器执行完后会向上执行父类析构器。

网友评论

      本文标题:13-Swift析构过程(Deinitialization)

      本文链接:https://www.haomeiwen.com/subject/hkcvzftx.html