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枚舉關(guān)聯(lián)值的內(nèi)存
這篇文章主要給大家介紹了關(guān)于Swift枚舉關(guān)聯(lián)值的內(nèi)存的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Swift實(shí)現(xiàn)表格視圖單元格單選(2)
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格單選的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
簡(jiǎn)陋的swift carthage copy-frameworks 輔助腳本代碼
下面小編就為大家分享一篇簡(jiǎn)陋的swift carthage copy-frameworks 輔助腳本代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法
這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
SwiftUI 中創(chuàng)建反彈動(dòng)畫的實(shí)現(xiàn)
這篇文章主要介紹了SwiftUI 中創(chuàng)建反彈動(dòng)畫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Swift算法實(shí)現(xiàn)逐字翻轉(zhuǎn)字符串的方法示例
大家都知道翻轉(zhuǎn)字符串在字符串算法中算是比較常見的,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)逐字翻轉(zhuǎn)字符串的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
Objective-C和Swift的轉(zhuǎn)換速查手冊(cè)(推薦)
這篇文章主要給大家介紹了關(guān)于Objective-C和Swift的轉(zhuǎn)換速查手冊(cè)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),非常推薦給大家參考學(xué)習(xí)使用,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)不2018-06-06

