一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - Swift 列舉內存管理與異常處理具體代碼

Swift 列舉內存管理與異常處理具體代碼

2022-01-24 14:45Lucky_William Swift

內存管理和異常處理在任何編程語言中都是核心概念。盡管有很多教程解釋了Swift自動引用計數的基本原理,但我發現沒有一個可以從編譯器的角度對其進行解釋。在本文中,我們將通過詳細代碼列舉學習Swift內存管理與異常處理

1. Swift 內存銷毀時機

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Swift5 內存銷毀時機
// 引用類型的內存銷毀時機
class ClassDemo {
    var a = "value a"
    deinit {
        // 實例被釋放
        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 引用的實例依然在,Optional("value a")
 
// 對實例引用被全部取消,ClassA 實例此處才銷毀
ins3 = nil // deinit class a

2. Swift 單向引用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Swift5 單向引用
class ClassA {
    
    deinit {
        print("deinit ClassA")
    }
    
    func foo() {
        print("func foo in ClassA")
    }
}
 
class ClassB {
    // 此處引用 ClassA 的實例
    var ins: ClassA?
    
    init(ins: ClassA?) {
        self.ins = ins
    }
    
    deinit {
        print("deinit ClassB")
    }
}
 
var clzA: ClassA? = ClassA()
var clzB: ClassB? = ClassB(ins: clzA)
 
// 此處 clzA 所引用的內存并未釋放
clzA = nil
// 依然可以調用 clzB 中的 clzA 實例的 foo 方法
clzB?.ins?.foo() // func foo in ClassA
// 此時 ClassB 實例被釋放,不再有引用指向 ClassA 隨即所占內存也被釋放
clzB = nil // deinit ClassB \n deinit ClassA

3. Swift 循環引用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Swift5 循環引用
class ClassC {
    var insD: ClassD?
    
    deinit {
        print("deinit ClassC")
    }
    
    func foo() {
        print("func foo in ClassC")
    }
}
 
class ClassD {
    // 此處引用 ClassC 的實例
    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 所引用的內存并未釋放,對應實例被 clzD 的 insC 引用
clzC = nil
// 依然可以調用 clzD 中的 insC 實例的 foo 方法
clzD?.insC?.foo() // func foo in ClassC
// 此時 clzD 的實例依然被 clzC 的 insD 引用,clzC 和 clzD 實例都未被釋放
clzD = nil

4. Swift 弱引用 解決 循環引用 問題

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Swift5 使用 弱引用 解決 循環引用
class ClassE {
    // 弱引用 weak
    weak var insF: ClassF?
    
    deinit {
        print("deinit ClassE")
    }
    
    func foo() {
        print("func foo in ClassE")
    }
}
 
class ClassF {
    // 此處引用 ClassE 的實例
    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 所引用的內存并未釋放,對應實例被 clzF 的 insE 引用
clzE = nil
// 依然可以調用 clzF 中的 insE 實例的 foo 方法
clzF?.insE?.foo() // func foo in ClassE
// 此時 clzF 的實例被 clzE 的 insF 弱引用,會被銷毀,clzE 和 clzF 實例都能被釋放
clzF = nil // deinit ClassF \n deinit ClassE

5. Swift 無主引用,針對類型為非 Optional

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Swift5 無主引用,針對類型為非 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 的實例
    var insG: ClassG?
    
    deinit {
        print("deinit ClassH")
    }
 
}
var clzH: ClassH? = ClassH()
var clzG: ClassG? = ClassG(ins: clzH!)
 
 
clzH?.insG = clzG
 
// 此處 clzG 所引用的內存并未釋放,對應實例被 clzH 的 insG 引用
clzG = nil
// 依然可以調用 clzH 中的 insG 實例的 foo 方法
clzH?.insG?.foo() // func foo in ClassG
// 此時 clzH 的實例被 clzG 的 insH 無主引用,會被銷毀,clzG 和 clzH 實例都能被釋放
clzH = nil // deinit ClassH \n deinit ClassG

6. Swift 閉包產生的循環引用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Swift5 閉包產生的循環引用
class ClassJ {
    var field = "field j"
    
    lazy var closure: () -> Void = {
        print(self.field)
    }
    
    deinit {
        print("deinit ClassJ")
    }
}
 
var objJ: ClassJ? = ClassJ()
objJ?.closure()
// 因為閉包引用了類的成員屬性,導致實例無法釋放,進而導致閉包無法釋放,產生循環引用
objJ = nil // 此處并沒有打印 deinit 中信息

7. Swift 解決閉包產生的循環引用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Swift5 解決閉包產生的循環引用
class ClassK {
    var field = "field k"
    
    lazy var closure: () -> Void = {
        // 使用捕獲列表對 self 進行無主引用的轉換
        [unowned self] () -> Void in
        print(self.field)
    }
    
    deinit {
        print("deinit ClassK")
    }
}
 
var objK: ClassK? = ClassK()
objK?.closure()
objK = nil // deinit ClassK

8. Swift 自定義異常類型

?
1
2
3
4
5
6
7
8
9
10
// Swift5 自定義異常類型
enum CustomError: Error {
    case ErrorOne
    case ErrorTwo
    case ErrorThree
}
 
print("error")
//throw CustomError.ErrorOne // 拋出的異常未捕獲會終止,不會打印 complete
print("complete")

9. Swift do-catch 捕獲異常,try 執行會拋異常的函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Swift5 使用 do-catch 捕獲異常,try 執行會拋異常的函數
// 通過函數拋出異常
func funcError() throws -> String {
    throw CustomError.ErrorTwo
}
 
// 使用 do-catch 捕獲異常
do {
    // 使用 try 執行可能會拋出異常的函數
    try funcError()
} catch CustomError.ErrorOne {
    print("ErrorOne")
} catch CustomError.ErrorTwo {
    print("ErrorTwo")
} catch CustomError.ErrorThree {
    print("ErrorThree")
}
 
// 使用 try? 將函數執行的結果映射為 Optional 類型
let result = try? funcError()
if (result == nil) {
    print("exec failed")
}
 
// try! 強行終止異常的傳遞,如果發生異常,則程序中斷
// try! funcError()

10. Swift 函數延時執行結構

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Swift5 函數延時執行結構:避免在拋異常的時候,保證某些必須的代碼塊要執行,如釋放資源
func lazyFunc() throws -> Void {
 
    defer {
        // 函數結束時會得到執行
        print("lazy part of func")
    }
    
    print("exec lazyFunc")
    throw CustomError.ErrorThree
}
 
// exec lazyFunc
// lazy part of func
try? lazyFunc()

GitHub 源碼:Reference&Error.playground

到此這篇關于Swift 列舉內存管理異常處理具體代碼的文章就介紹到這了,更多相關Swift 內存管理與異常處理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/java_android_man/article/details/121503916

延伸 · 閱讀

精彩推薦
  • SwiftSwift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術師14382021-01-06
  • SwiftSwift實現多個TableView側滑與切換效果

    Swift實現多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現對Mac開發的影響和對Objective-C的影響。...

    Swift教程網4412020-12-16
  • SwiftSwift的74個常用內置函數介紹

    Swift的74個常用內置函數介紹

    這篇文章主要介紹了Swift的74個常用內置函數介紹,這篇文章列舉出了所有的Swift庫函數,內置函數是指無需引入任何模塊即可以直接使用的函數,需要的朋友可...

    Swift教程網5802020-12-19
  • SwiftSwift教程之基礎數據類型詳解

    Swift教程之基礎數據類型詳解

    這篇文章主要介紹了Swift教程之基礎數據類型詳解,本文詳細講解了Swift中的基本數據類型和基本語法,例如常量和變量、注釋、分號、整數、數值類型轉換等...

    Swift教程網5162020-12-18
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環境時,出現了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網2232020-12-16
  • SwiftSwift使用CollectionView實現廣告欄滑動效果

    Swift使用CollectionView實現廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術博客12372021-01-13
主站蜘蛛池模板: 丰满岳乱妇在线观看视频国产 | 亚洲欧美综合人成野草 | 国产一级黄毛片 | 无限资源在线观看播放 | 色老板视频在线观看 | 国产色综合久久五月色婷婷中文 | 欧美日韩精品一区二区三区视频 | ts视频在线观看 | 九九精品国产 | 日本三级免费观看 | 午夜在线观看免费完整直播网页 | 国产精品久久久精品视频 | 9966久久精品免费看国产 | 亚洲va欧美va国产综合久久 | 国模孕妇季玥全部人体写真 | 2022国产在线观看 | 91视频www | 脱jk裙的美女露小内内无遮挡 | 98精品全国免费观看视频 | 免费国产在线观看 | 国产成人精品高清在线 | 污污在线免费观看 | 外女思春台湾三级 | 农村老妇1乱69系列小说 | 欧美日韩一区二区三区韩大 | 明星ai人脸替换造梦在线播放 | 国产成人精品一区二三区 | 色橹| 国产精品视频在线观看 | re99| 国产草草 | 艹b视频在线观看 | 农村妇女野战bbxxx | 97香蕉超级碰碰碰久久兔费 | 成人国产一区二区 | 丁香久久婷婷 | 国产v在线播放 | 91青青视频 | 国产在线精品一区二区高清不卡 | 单身男女韩剧在线看 | 美女精品永久福利在线 |