自動閉包翁涤、逃逸閉包和非逃逸閉包三個概念有些不好理解盗迟,這里按我自己的理解總結(jié)一下,不對的地方請指正
一灸撰、
非逃逸閉包:只能在作為參數(shù)傳入的函數(shù)體中調(diào)用,可能是在函數(shù)結(jié)束后會釋放掉。(非逃逸浮毯,大概就是說逃不出這個函數(shù)的手掌心?)
特點:
1.目前Swift默認的閉包都是非逃逸閉包 用@noescape修飾
二完疫、逃逸閉包:可以在作為參數(shù)傳入的函數(shù)體外調(diào)用(return之后或者多線程延時執(zhí)行),在這個函數(shù)結(jié)束后依然可能保存在內(nèi)存中债蓝。
特點:
1.用@escaping修飾壳鹤,可以在傳入的函數(shù)結(jié)束后調(diào)用
三、
自動閉包:即通過表達式自動生成無參閉包類型
特點:
1.語法簡便
2.聲明包含自動閉包的函數(shù)使用@autoclosure饰迹。
3.自動閉包暗含非逃逸閉包特性芳誓,改為逃逸閉包則使用@autoclosure(escaping)
4.可以延遲求值。
注意:
延遲求值啊鸭。這是一個精(dan)妙(teng)的描述锹淌,如果你理解成不需要@escaping修飾就可以多線程延時調(diào)用就錯了。所以延遲求值到底是什么鬼赠制?百度百科如下:
http://baike.baidu.com/link?url=Djs1GecdT-YpE2vSBZJlL2iWct0HUjLemRVUwvYZNkmxGjUhuVJNQ_SgXGhuLgWycocvKXP-G3b5B7lCIMSpvXDcMokq3Cc2bIrGJKXCWDurSGpTjRXwaePp7MOyqbLE
看起來和懶加載異曲同工, 或者說閉包中的代碼其實是另外一個函數(shù), 只有調(diào)用的時候才真正運行赂摆。雖然自動閉包在語法上并不是嚴格的函數(shù)形式,但是其本質(zhì)卻不會改變钟些,所以所謂的“自動閉包能夠延時求值”大概的意思就是:自動閉包是閉包烟号,雖然看起來可能不像閉包,但它真?是閉包啊??厘唾。