1.概述
defer關(guān)鍵字是修飾一段函數(shù)內(nèi)任一段代碼,使其必須在函數(shù)中的其余代碼都執(zhí)行完畢,函數(shù)即將結(jié)束前調(diào)用??梢岳斫鉃閷⒀舆t執(zhí)行。
2.細(xì)解
2.1 代碼寫(xiě)一段
func testMethod_defer() {
print("函數(shù)開(kāi)始");
defer {
print("defer_1");
}
defer {
print("defer_2");
}
print("函數(shù)結(jié)束")
}
2.2 執(zhí)行結(jié)果
函數(shù)開(kāi)始
函數(shù)結(jié)束
defer_2
defer_1
2.3 分析結(jié)果
由打印結(jié)果可以發(fā)現(xiàn),兩個(gè)defer都執(zhí)行了,都在函數(shù)的最后執(zhí)行的。
defer_2先于defer_1執(zhí)行,說(shuō)明如果一個(gè)函數(shù)中如果包含多個(gè)defer的話,會(huì)按照自下而上的屬性去執(zhí)行defer。
3.進(jìn)階版,異步情況
3.1 代碼
func testMethod_deferAsync() {
print("函數(shù)開(kāi)始");
defer {
print("defer_1");
}
DispatchQueue.main.asyncAfter(deadline: .now()+1) {
print("異步執(zhí)行");
}
defer {
print("defer_2");
}
print("函數(shù)結(jié)束")
}
3.2 執(zhí)行結(jié)果
函數(shù)開(kāi)始
函數(shù)結(jié)束
defer_2
defer_1
異步執(zhí)行
3.3 分析結(jié)果
由打印結(jié)果可以看到,異步代碼的執(zhí)行,不會(huì)影響到defer的執(zhí)行時(shí)間。
事實(shí)上,defer的執(zhí)行只和其所在的作用域有關(guān),如果作用域即將被回收,那么會(huì)在回收之前執(zhí)行defer。