zoukankan      html  css  js  c++  java
  • 学习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)")
  • 相关阅读:
    开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
    UTF8与GBK、GB2312等其他字符编码的相互转换
    深入理解Netty框架
    论一道编程面试题解法
    JVM调优总结-Xms -Xmx -Xmn -Xss
    Linux上安装jdk1.8和配置环境变量
    .NET GC垃圾回收器
    T4 模板
    Vue 环境搭建
    Spring Cloud 入门系列(一)
  • 原文地址:https://www.cnblogs.com/Alex-sk/p/5536252.html
Copyright © 2011-2022 走看看