? ? 這個(gè)是開篇的第一篇,也就是說會(huì)有第二第三篇,等等. 但是呢, 也有可能就沒有開篇的第二和之后的篇幅了.(請(qǐng)注意我的昵稱,里面有個(gè)'鴿',不鴿你們鴿誰).
? ? 好了,第一篇的話呢,先說說iOS里面的一個(gè)概念就是Block. 這是Objective-c里面的說法,那么在swift里面相應(yīng)的概念是Closure,翻譯出來叫閉包. 同時(shí)Kotlin 和 javascript 也是有這個(gè)概念的,在Kotlin 里面呢叫l(wèi)amada表達(dá)式.
? ? 好吧,這里第一篇里面要說的呢是Objective-c里面的Block.那這里就有人問了,那你提那么多其他語言里面的概念來干什么呢?Php里面也有Closure的呀! 對(duì)不起我沒接觸過Php.并且在接下來的篇幅里(可能不存在的篇幅)會(huì)逐個(gè)比較Nodejs(ES6) swift 和Objective-c里面的這個(gè)閉包的相同和不同以及相應(yīng)的特色.(Kotlin 里面的閉包呢,由于剛剛接觸不久,我也會(huì)盡力找資料的!!! 但是也有可能不會(huì)找!)
? ?言歸正傳,word is shit, show me the code!
? ? 好了, 那么怎么用呢?看下面!
? 這個(gè)結(jié)果呢是:[@83,@32]
上面的是將Block當(dāng)做返回值來用的. Block當(dāng)做參數(shù)來也很好使的,拿做動(dòng)畫的方法來說吧!看下面
? ? 相信這個(gè)都是用過的,那么做為參數(shù)來說怎么寫呢?
這里的話就要分為兩個(gè)部分來說了,因?yàn)锽lock就和函數(shù)基本是一樣的.就是需要定義,和調(diào)用.那么,這樣的話呢,我們就要把Block的定義交給調(diào)用者來定義,我們?cè)诤线m的時(shí)機(jī)執(zhí)行這個(gè)Block就可以讓Block達(dá)到預(yù)期的效果了!具體看下面!
看上面的調(diào)用是不是和用AFN一樣了!
好了上面就是Block的基礎(chǔ)用法了.下面開始說一說Block的細(xì)節(jié)東西了!
先看一個(gè)Block
然后用clang來重新編譯一下,
好上面兩張圖片,我們重點(diǎn)放在第一張那個(gè)方法列表的圖片上,下面的那張暫時(shí)不說.
你們看到了,這個(gè)是我這個(gè)類的方法列表,你們有些調(diào)皮的就會(huì)問了, 這個(gè)你怎么就知道是方法列表了?
你們那個(gè)結(jié)構(gòu)體的命名嘛!BlockTestObjc_IMPL,BlockTestObjc是我這個(gè)類imp是方法實(shí)現(xiàn),L用鍵盤也能猜出來是list呀.所以說命名很重要哇.
這樣的話也就是說其實(shí)最后Block編譯之后應(yīng)該就是一個(gè)函數(shù)指針了,或者是說相當(dāng)于一個(gè)函數(shù)指針,因?yàn)檫@個(gè)只是clang重編譯出來的,我不能確定一定是最后的實(shí)現(xiàn),但是還是有很大的參考價(jià)值(今天時(shí)間不早了, 暫時(shí)先寫到這里,未完待續(xù)...)