swift - 析構(gòu)過(guò)程

//析構(gòu)函數(shù)
//析構(gòu)過(guò)程原理
//Swift 會(huì)自動(dòng)釋放不再需要的實(shí)例以釋放資源吩跋。如自動(dòng)引用計(jì)數(shù)章節(jié)中所講述,Swift 通過(guò) 自動(dòng)引用計(jì)數(shù)(AR C) 處理實(shí)例的內(nèi)存管理。通常當(dāng)你的實(shí)例被釋放時(shí)不需要手動(dòng)地去清理渔工。但是,當(dāng)使用自己的資源時(shí),你可能 需要進(jìn)行一些額外的清理锌钮。例如,如果創(chuàng)建了一個(gè)自定義的類(lèi)來(lái)打開(kāi)一個(gè)文件,并寫(xiě)入一些數(shù)據(jù),你可能需要在 類(lèi)實(shí)例被釋放之前手動(dòng)去關(guān)閉該文件。
// 在類(lèi)的定義中,每個(gè)類(lèi)最多只能有一個(gè)析構(gòu)器,而且析構(gòu)器不帶任何參數(shù),如下所示:
// deinit {
// 執(zhí)行析構(gòu)過(guò)程
// }

   // 析構(gòu)器是在實(shí)例釋放發(fā)生前被自動(dòng)調(diào)用引矩。你不能主動(dòng)調(diào)用析構(gòu)器梁丘。子類(lèi)繼承了父類(lèi)的析構(gòu)器,并且在子類(lèi)析構(gòu)器實(shí)現(xiàn)的最后,父類(lèi)的析構(gòu)器會(huì)被自動(dòng)調(diào)用。即使子類(lèi)沒(méi)有提供自己的析構(gòu)器,父類(lèi)的析構(gòu)器也同樣會(huì)被調(diào)用旺韭。因?yàn)橹钡綄?shí)例的析構(gòu)器被調(diào)用后,實(shí)例才會(huì)被釋放,所以析構(gòu)器可以訪問(wèn)實(shí)例的所有屬性,并且可以根據(jù)那些屬性可以修改它的行為(比如查找一個(gè)需要被關(guān)閉的文件)氛谜。
    
    
    //析構(gòu)函數(shù)實(shí)踐
    class Bank {
    
        static var coinsInBank = 10_000
        static func disTribute(coins numberOfCoinsRequested: NSInteger) -> NSInteger {
        
            let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
            coinsInBank -= numberOfCoinsToVend
            return numberOfCoinsToVend
        }
        static func receive(coins: NSInteger) {
        
            coinsInBank += coins
        }
        
    }
    
   // Bank 使用 coinsInBank 屬性來(lái)跟蹤它當(dāng)前擁有的硬幣數(shù)量。 Bank 還提供了兩個(gè)方法, distribute(coins:) 和 r eceive(coins:) ,分別用來(lái)處理硬幣的分發(fā)和收 茂翔。
    //distribute(coins:) 方法在 Bank 對(duì)象分發(fā)硬幣之前檢查是否有足夠的硬幣混蔼。如果硬幣不足, Bank 對(duì)象會(huì)返回一 個(gè)比請(qǐng)求時(shí)小的數(shù)字(如果 Bank 對(duì)象中沒(méi)有硬幣了就返回 0 )。此方法返回一個(gè)整型值,表示提供的硬幣的實(shí) 際數(shù)量珊燎。
    //receive(coins:) 方法只是將 Bank 實(shí)例接收到的硬幣數(shù)目加回硬幣存儲(chǔ)中惭嚣。
   // Player 類(lèi)描述了游戲中的一個(gè)玩家。每一個(gè)玩家在任意時(shí)間都有一定數(shù)量的硬幣存儲(chǔ)在他們的錢(qián)包中悔政。這通過(guò)玩 家的 coinsInPurse 屬性來(lái)表示:
    class Player {
    
        var coinsInPurse: NSInteger
        init(coins: NSInteger) {
            coinsInPurse = Bank.disTribute(coins: coins)
        }
        func win(coins: NSInteger) {
            coinsInPurse += Bank.disTribute(coins: coins)
        }
        deinit {
            Bank.receive(coins: coinsInPurse)
        }
        
    }
    //每個(gè) Player 實(shí)例在初始化的過(guò)程中,都從 Bank 對(duì)象獲取指定數(shù)量的硬幣晚吞。如果沒(méi)有足夠的硬幣可用, Player 實(shí)例可能會(huì)收到比指定數(shù)量少的硬幣.
    //Player 類(lèi)定義了一個(gè) win(coins:) 方法,該方法從 Bank 對(duì)象獲取一定數(shù)量的硬幣,并把它們添加到玩家的錢(qián) 包。 Player 類(lèi)還實(shí)現(xiàn)了一個(gè)析構(gòu)器,這個(gè)析構(gòu)器在 Player 實(shí)例釋放前被調(diào)用谋国。在這里,析構(gòu)器的作用只是將玩 家的所有硬幣都返還給 Bank 對(duì)象:
    var playerOne: Player? = Player(coins: 100)
    print("A new player has joined the game with \(playerOne!.coinsInPurse) coins") // 打印 "A new player has joined the game with 100 coins"
    print("There are now \(Bank.coinsInBank) coins left in the bank")
    // 打印 "There are now 9900 coins left in the bank"
    
   // 創(chuàng)建一個(gè) Player 實(shí)例的時(shí)候,會(huì)向 Bank 對(duì)象請(qǐng)求 100 個(gè)硬幣,如果有足夠的硬幣可用的話槽地。這個(gè) Player 實(shí)例 存儲(chǔ)在一個(gè)名為 playerOne 的可選類(lèi)型的變量中。這里使用了一個(gè)可選類(lèi)型的變量,因?yàn)橥婕铱梢噪S時(shí)離開(kāi)游 戲,設(shè)置為可選使你可以追蹤玩家當(dāng)前是否在游戲中芦瘾。
   // 因?yàn)?playerOne 是可選的,所以訪問(wèn)其 coinsInPurse 屬性來(lái)打印錢(qián)包中的硬幣數(shù)量時(shí),使用感嘆號(hào)( ! )來(lái)解 包:
    playerOne!.win(coins: 2_000)
    print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins") // 輸出 "PlayerOne won 2000 coins & now has 2100 coins"
    print("The bank now only has \(Bank.coinsInBank) coins left")
    // 輸出 "The bank now only has 7900 coins left"
   // 這里,玩家已經(jīng)贏得了 2,000 枚硬幣,所以玩家的錢(qián)包中現(xiàn)在有 2,100 枚硬幣,而 Bank 對(duì)象只剩余 7,900 枚 硬幣捌蚊。
    playerOne = nil
    print("PlayerOne has left the game")
    // 打印 "PlayerOne has left the game"
    print("The bank now has \(Bank.coinsInBank) coins") // 打印 "The bank now has 10000 coins"
    //玩家現(xiàn)在已經(jīng)離開(kāi)了游戲。這通過(guò)將可選類(lèi)型的 playerOne 變量設(shè)置為 nil 來(lái)表示,意味著“沒(méi)有 Player 實(shí) 例”近弟。當(dāng)這一切發(fā)生時(shí), playerOne 變量對(duì) Player 實(shí)例的引用被破壞了缅糟。沒(méi)有其它屬性或者變量引用 Player 實(shí) 例,因此該實(shí)例會(huì)被釋放,以便回收內(nèi)存。在這之前,該實(shí)例的析構(gòu)器被自動(dòng)調(diào)用,玩家的硬幣被返還給銀行祷愉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窗宦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子二鳄,更是在濱河造成了極大的恐慌赴涵,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件订讼,死亡現(xiàn)場(chǎng)離奇詭異髓窜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)躯嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)纱烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人擂啥,你說(shuō)我怎么就攤上這事∥荻郑” “怎么了山宾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵资锰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绷杜,道長(zhǎng),這世上最難降的妖魔是什么圾结? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任筝野,我火速辦了婚禮粤剧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抵恋。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布梯醒。 她就那樣靜靜地躺著腌紧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号胚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天箱亿,我揣著相機(jī)與錄音弃秆,去河邊找鬼。 笑死脑豹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衡查。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俱饿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稍途!你這毒婦竟也來(lái)了砚婆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坷虑,失蹤者是張志新(化名)和其女友劉穎迄损,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芹敌,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氏捞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年液茎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞造。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋烤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝴光,到底是詐尸還是另有隱情达址,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布疆虚,位于F島的核電站满葛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘀韧。R本人自食惡果不足惜篇亭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一译蒂、第九天 我趴在偏房一處隱蔽的房頂上張望柔昼。 院中可真熱鬧,春花似錦捕透、人聲如沸碴萧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)低缩。三九已至,卻和暖如春讳推,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背银觅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工究驴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洒忧。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓够颠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親履磨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.簡(jiǎn)介 析構(gòu)器 只適用于類(lèi)類(lèi)型,當(dāng)一個(gè)類(lèi)的實(shí)例被釋放之前矛辕,析構(gòu)器會(huì)被立即調(diào)用笑跛。析構(gòu)器用關(guān)鍵字 deinit 來(lái)標(biāo)...
    sudhengshi閱讀 335評(píng)論 0 1
  • 在一個(gè)類(lèi)的實(shí)例被釋放之前堡牡,析構(gòu)函數(shù)被立即調(diào)用晤柄。用關(guān)鍵字deinit來(lái)標(biāo)示析構(gòu)函數(shù),類(lèi)似于初始化函數(shù)用init來(lái)標(biāo)示...
    零度_不結(jié)冰閱讀 216評(píng)論 0 0
  • ?析構(gòu)器只適用于類(lèi)芥颈,當(dāng)一個(gè)類(lèi)的實(shí)例被釋放之前赚抡,析構(gòu)器會(huì)被立即調(diào)用。析構(gòu)器用deinit關(guān)鍵字來(lái)標(biāo)示涂臣。 一售担、析構(gòu)過(guò)程...
    EndEvent閱讀 408評(píng)論 1 3
  • 本章將會(huì)介紹 存儲(chǔ)屬性的初始賦值自定義構(gòu)造過(guò)程默認(rèn)構(gòu)造器值類(lèi)型的構(gòu)造器代理類(lèi)的繼承和構(gòu)造過(guò)程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 769評(píng)論 0 0
  • 126.析構(gòu)器 在一個(gè)類(lèi)實(shí)例銷(xiāo)毀前,一個(gè)析構(gòu)器會(huì)立即調(diào)用。使用deinit 關(guān)鍵字來(lái)表示析構(gòu)器, 跟構(gòu)造器寫(xiě)法類(lèi)似...
    無(wú)灃閱讀 804評(píng)論 0 4