Swift5 内存引用与异常处理
1. Swift 内存销毁时机
class ClassDemo {
var a = "value a"
deinit {
print("deinit class a")
}
}
var ins1: ClassDemo? = ClassDemo()
var ins2 = ins1
var ins3 = ins2
ins1 = nil
ins2 = nil
print(String(describing: ins3?.a))
ins3 = nil
2. Swift 单向引用
class ClassA {
deinit {
print("deinit ClassA")
}
func foo() {
print("func foo in ClassA")
}
}
class ClassB {
var ins: ClassA?
init(ins: ClassA?) {
self.ins = ins
}
deinit {
print("deinit ClassB")
}
}
var clzA: ClassA? = ClassA()
var clzB: ClassB? = ClassB(ins: clzA)
clzA = nil
clzB?.ins?.foo()
clzB = nil
3. Swift 循环引用
class ClassC {
var insD: ClassD?
deinit {
print("deinit ClassC")
}
func foo() {
print("func foo in ClassC")
}
}
class ClassD {
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 = nil
clzD?.insC?.foo()
clzD = nil
4. Swift 弱引用 解决 循环引用 问题
class ClassE {
weak var insF: ClassF?
deinit {
print("deinit ClassE")
}
func foo() {
print("func foo in ClassE")
}
}
class ClassF {
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 = nil
clzF?.insE?.foo()
clzF = nil
5. Swift 无主引用,针对类型为非 Optional
class ClassG {
unowned var insH: ClassH
init(ins: ClassH) {
self.insH = ins
}
func foo() {
print("func foo in ClassG")
}
deinit {
print("deinit ClassG")
}
}
class ClassH {
var insG: ClassG?
deinit {
print("deinit ClassH")
}
}
var clzH: ClassH? = ClassH()
var clzG: ClassG? = ClassG(ins: clzH!)
clzH?.insG = clzG
clzG = nil
clzH?.insG?.foo()
clzH = nil
6. Swift 闭包产生的循环引用
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
7. Swift 解决闭包产生的循环引用
class ClassK {
var field = "field k"
lazy var closure: () -> Void = {
[unowned self] () -> Void in
print(self.field)
}
deinit {
print("deinit ClassK")
}
}
var objK: ClassK? = ClassK()
objK?.closure()
objK = nil
8. Swift 自定义异常类型
enum CustomError: Error {
case ErrorOne
case ErrorTwo
case ErrorThree
}
print("error")
print("complete")
9. Swift do-catch 捕获异常,try 执行会抛异常的函数
func funcError() throws -> String {
throw CustomError.ErrorTwo
}
do {
try funcError()
} catch CustomError.ErrorOne {
print("ErrorOne")
} catch CustomError.ErrorTwo {
print("ErrorTwo")
} catch CustomError.ErrorThree {
print("ErrorThree")
}
let result = try? funcError()
if (result == nil) {
print("exec failed")
}
10. Swift 函数延时执行结构
func lazyFunc() throws -> Void {
defer {
print("lazy part of func")
}
print("exec lazyFunc")
throw CustomError.ErrorThree
}
try? lazyFunc()