相似點:
函數(shù)指針和Block都可以實現(xiàn)回調(diào)的操作,聲明上也很相似,實現(xiàn)上都可以看成是一個代碼片段。
函數(shù)指針類型和Block類型都可以作為變量和函數(shù)參數(shù)的類型。(typedef定義別名之后,這個別名就是一個類型)
不同點:
函數(shù)指針只能指向預(yù)先定義好的函數(shù)代碼塊(可以是其他文件里面定義,通過函數(shù)參數(shù)動態(tài)傳入的),函數(shù)地址是在編譯鏈接時就已經(jīng)確定好的。
Block本質(zhì)是Objective-C對象,是NSObject的子類,可以接收消息。
函數(shù)里面只能訪問全局變量,而Block代碼塊不光能訪問全局變量,還擁有當(dāng)前棧內(nèi)存和堆內(nèi)存變量的可讀性(當(dāng)然通過__block訪問指示符修飾的局部變量還可以在block代碼塊里面進(jìn)行修改)。
從內(nèi)存的角度看,函數(shù)指針只不過是指向代碼區(qū)的一段可執(zhí)行代碼,而block實際上是程序運(yùn)行過程中在棧內(nèi)存動態(tài)創(chuàng)建的對象,可以向其發(fā)送copy消息將block對象拷貝到堆內(nèi)存,以延長其生命周期。