最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift?列舉內(nèi)存管理與異常處理具體代碼

 更新時(shí)間:2021年11月24日 11:06:38   作者:Lucky_William  
內(nèi)存管理和異常處理在任何編程語(yǔ)言中都是核心概念。盡管有很多教程解釋了Swift自動(dòng)引用計(jì)數(shù)的基本原理,但我發(fā)現(xiàn)沒有一個(gè)可以從編譯器的角度對(duì)其進(jìn)行解釋。在本文中,我們將通過詳細(xì)代碼列舉學(xué)習(xí)Swift內(nèi)存管理與異常處理

1. Swift 內(nèi)存銷毀時(shí)機(jī)

// Swift5 內(nèi)存銷毀時(shí)機(jī)
// 引用類型的內(nèi)存銷毀時(shí)機(jī)
class ClassDemo {
    var a = "value a"
    deinit {
        // 實(shí)例被釋放
        print("deinit class a")
    }
}

// 可空類型
var ins1: ClassDemo? = ClassDemo()
var ins2 = ins1
var ins3 = ins2

ins1 = nil // 取消 ins1 引用
ins2 = nil // 取消 ins2 引用
print(String(describing: ins3?.a)) // 此處 ins3 引用的實(shí)例依然在,Optional("value a")

// 對(duì)實(shí)例引用被全部取消,ClassA 實(shí)例此處才銷毀
ins3 = nil // deinit class a

2. Swift 單向引用

// Swift5 單向引用
class ClassA {
    
    deinit {
        print("deinit ClassA")
    }
    
    func foo() {
        print("func foo in ClassA")
    }
}

class ClassB {
    // 此處引用 ClassA 的實(shí)例
    var ins: ClassA?
    
    init(ins: ClassA?) {
        self.ins = ins
    }
    
    deinit {
        print("deinit ClassB")
    }
}

var clzA: ClassA? = ClassA()
var clzB: ClassB? = ClassB(ins: clzA)

// 此處 clzA 所引用的內(nèi)存并未釋放
clzA = nil
// 依然可以調(diào)用 clzB 中的 clzA 實(shí)例的 foo 方法
clzB?.ins?.foo() // func foo in ClassA
// 此時(shí) ClassB 實(shí)例被釋放,不再有引用指向 ClassA 隨即所占內(nèi)存也被釋放
clzB = nil // deinit ClassB \n deinit ClassA

3. Swift 循環(huán)引用

// Swift5 循環(huán)引用
class ClassC {
    var insD: ClassD?
    
    deinit {
        print("deinit ClassC")
    }
    
    func foo() {
        print("func foo in ClassC")
    }
}

class ClassD {
    // 此處引用 ClassC 的實(shí)例
    var insC: ClassC?
    
    init(ins: ClassC?) {
        self.insC = ins
    }
    
    deinit {
        print("deinit ClassD")
    }
}

var clzC: ClassC? = ClassC()
var clzD: ClassD? = ClassD(ins: clzC)

clzC?.insD = clzD

// 此處 clzC 所引用的內(nèi)存并未釋放,對(duì)應(yīng)實(shí)例被 clzD 的 insC 引用
clzC = nil
// 依然可以調(diào)用 clzD 中的 insC 實(shí)例的 foo 方法
clzD?.insC?.foo() // func foo in ClassC
// 此時(shí) clzD 的實(shí)例依然被 clzC 的 insD 引用,clzC 和 clzD 實(shí)例都未被釋放
clzD = nil

4. Swift 弱引用 解決 循環(huán)引用 問題

// Swift5 使用 弱引用 解決 循環(huán)引用
class ClassE {
    // 弱引用 weak
    weak var insF: ClassF?
    
    deinit {
        print("deinit ClassE")
    }
    
    func foo() {
        print("func foo in ClassE")
    }
}

class ClassF {
    // 此處引用 ClassE 的實(shí)例
    var insE: ClassE?
    
    init(ins: ClassE?) {
        self.insE = ins
    }
    
    deinit {
        print("deinit ClassF")
    }
}

var clzE: ClassE? = ClassE()
var clzF: ClassF? = ClassF(ins: clzE)

clzE?.insF = clzF

// 此處 clzE 所引用的內(nèi)存并未釋放,對(duì)應(yīng)實(shí)例被 clzF 的 insE 引用
clzE = nil
// 依然可以調(diào)用 clzF 中的 insE 實(shí)例的 foo 方法
clzF?.insE?.foo() // func foo in ClassE
// 此時(shí) clzF 的實(shí)例被 clzE 的 insF 弱引用,會(huì)被銷毀,clzE 和 clzF 實(shí)例都能被釋放
clzF = nil // deinit ClassF \n deinit ClassE

5. Swift 無主引用,針對(duì)類型為非 Optional

// Swift5 無主引用,針對(duì)類型為非 Optional
class ClassG {
    // 無主引用 unowned 假定屬性不為 nil
    unowned var insH: ClassH
    
    init(ins: ClassH) {
        self.insH = ins
    }
    func foo() {
        print("func foo in ClassG")
    }
    deinit {
        print("deinit ClassG")
    }
}

class ClassH {
    // 此處引用 ClassE 的實(shí)例
    var insG: ClassG?
    
    deinit {
        print("deinit ClassH")
    }

}
var clzH: ClassH? = ClassH()
var clzG: ClassG? = ClassG(ins: clzH!)


clzH?.insG = clzG

// 此處 clzG 所引用的內(nèi)存并未釋放,對(duì)應(yīng)實(shí)例被 clzH 的 insG 引用
clzG = nil
// 依然可以調(diào)用 clzH 中的 insG 實(shí)例的 foo 方法
clzH?.insG?.foo() // func foo in ClassG
// 此時(shí) clzH 的實(shí)例被 clzG 的 insH 無主引用,會(huì)被銷毀,clzG 和 clzH 實(shí)例都能被釋放
clzH = nil // deinit ClassH \n deinit ClassG

6. Swift 閉包產(chǎn)生的循環(huán)引用

// Swift5 閉包產(chǎn)生的循環(huán)引用
class ClassJ {
    var field = "field j"
    
    lazy var closure: () -> Void = {
        print(self.field)
    }
    
    deinit {
        print("deinit ClassJ")
    }
}

var objJ: ClassJ? = ClassJ()
objJ?.closure()
// 因?yàn)殚]包引用了類的成員屬性,導(dǎo)致實(shí)例無法釋放,進(jìn)而導(dǎo)致閉包無法釋放,產(chǎn)生循環(huán)引用
objJ = nil // 此處并沒有打印 deinit 中信息

7. Swift 解決閉包產(chǎn)生的循環(huán)引用

// Swift5 解決閉包產(chǎn)生的循環(huán)引用
class ClassK {
    var field = "field k"
    
    lazy var closure: () -> Void = {
        // 使用捕獲列表對(duì) self 進(jìn)行無主引用的轉(zhuǎn)換
        [unowned self] () -> Void in
        print(self.field)
    }
    
    deinit {
        print("deinit ClassK")
    }
}

var objK: ClassK? = ClassK()
objK?.closure()
objK = nil // deinit ClassK

8. Swift 自定義異常類型

// Swift5 自定義異常類型
enum CustomError: Error {
    case ErrorOne
    case ErrorTwo
    case ErrorThree
}

print("error")
//throw CustomError.ErrorOne // 拋出的異常未捕獲會(huì)終止,不會(huì)打印 complete
print("complete")

9. Swift do-catch 捕獲異常,try 執(zhí)行會(huì)拋異常的函數(shù)

// Swift5 使用 do-catch 捕獲異常,try 執(zhí)行會(huì)拋異常的函數(shù)
// 通過函數(shù)拋出異常
func funcError() throws -> String {
    throw CustomError.ErrorTwo
}

// 使用 do-catch 捕獲異常
do {
    // 使用 try 執(zhí)行可能會(huì)拋出異常的函數(shù)
    try funcError()
} catch CustomError.ErrorOne {
    print("ErrorOne")
} catch CustomError.ErrorTwo {
    print("ErrorTwo")
} catch CustomError.ErrorThree {
    print("ErrorThree")
}

// 使用 try? 將函數(shù)執(zhí)行的結(jié)果映射為 Optional 類型
let result = try? funcError()
if (result == nil) {
    print("exec failed")
}

// try! 強(qiáng)行終止異常的傳遞,如果發(fā)生異常,則程序中斷
// try! funcError()

10. Swift 函數(shù)延時(shí)執(zhí)行結(jié)構(gòu)

// Swift5 函數(shù)延時(shí)執(zhí)行結(jié)構(gòu):避免在拋異常的時(shí)候,保證某些必須的代碼塊要執(zhí)行,如釋放資源
func lazyFunc() throws -> Void {

    defer {
        // 函數(shù)結(jié)束時(shí)會(huì)得到執(zhí)行
        print("lazy part of func")
    }
    
    print("exec lazyFunc")
    throw CustomError.ErrorThree
}

// exec lazyFunc
// lazy part of func
try? lazyFunc()

GitHub 源碼:Reference&Error.playground

到此這篇關(guān)于Swift 列舉內(nèi)存管理與異常處理具體代碼的文章就介紹到這了,更多相關(guān)Swift 內(nèi)存管理與異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift中static和class關(guān)鍵字的深入講解

    Swift中static和class關(guān)鍵字的深入講解

    這篇文章主要給大家介紹了關(guān)于Swift中static和class關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Swift算法實(shí)現(xiàn)逐字翻轉(zhuǎn)字符串的方法示例

    Swift算法實(shí)現(xiàn)逐字翻轉(zhuǎn)字符串的方法示例

    大家都知道翻轉(zhuǎn)字符串在字符串算法中算是比較常見的,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)逐字翻轉(zhuǎn)字符串的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • OpenStack的Swift組件詳解

    OpenStack的Swift組件詳解

    這篇文章主要介紹了OpenStack的Swift組件,對(duì)swift感興趣的同學(xué),可以參考下
    2021-04-04
  • Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能

    Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能

    這篇文章主要給大家介紹了關(guān)于Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來一起看看吧
    2018-05-05
  • Swift中的訪問控制和protected

    Swift中的訪問控制和protected

    這篇文章主要介紹了Swift中的訪問控制和protected,本文主要講解為什么Swift沒有類似protected的選項(xiàng),需要的朋友可以參考下
    2015-05-05
  • 如何刪掉編程中的?Switch?語(yǔ)句

    如何刪掉編程中的?Switch?語(yǔ)句

    多重方法是一種有趣的方式,可以幫你擺脫令人討厭的?switch,這篇文章主要介紹了如何刪掉編程中的?Switch?語(yǔ)句,需要的朋友可以參考下
    2022-09-09
  • Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    這篇文章主要為大家介紹了Swift動(dòng)態(tài)更換app圖標(biāo)AppIcon的簡(jiǎn)單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Swift繪制漸變色的方法

    Swift繪制漸變色的方法

    這篇文章主要為大家詳細(xì)介紹了Swift繪制漸變色的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 利用Swift如何計(jì)算文本的size示例詳解

    利用Swift如何計(jì)算文本的size示例詳解

    這篇文章主要給大家介紹了關(guān)于利用Swift如何計(jì)算文本的size的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們的工作或者學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Swift Set集合及常用方法詳解總結(jié)

    Swift Set集合及常用方法詳解總結(jié)

    Set集合為集類型,集是最簡(jiǎn)單的一種集合,存放于集中的對(duì)象不按特定方式排序,只是簡(jiǎn)單地把對(duì)象加入集合中,類似于向口袋里放東西,對(duì)集中存在的對(duì)象的訪問和操作是通過對(duì)象的引用進(jìn)行的,因此在集中不能存放重復(fù)對(duì)象
    2021-11-11

最新評(píng)論

鄂尔多斯市| 仪征市| 炎陵县| 无极县| 德清县| 宁津县| 临海市| 嵊泗县| 寿阳县| 宜州市| 宾阳县| 临沂市| 闸北区| 伊宁县| 榕江县| 雷波县| 望江县| 新巴尔虎左旗| 台前县| 古交市| 合山市| 库尔勒市| 英德市| 婺源县| 尼玛县| 垦利县| 九寨沟县| 长子县| 阳曲县| 奈曼旗| 兴义市| 石河子市| 蒙阴县| 祥云县| 苍南县| 黔江区| 泾源县| 唐河县| 兰考县| 景洪市| 西宁市|