相似點 1.函數指針和Block都可以實現回調的操作,聲明上也很相似,實現上都可以看成是一個代碼片段。 2.函數指針類型和Block類型都可以作為變數和函數參數的類型。(typedef定義別名之後,這個別名就是一個類型) 不同點 1.函數指針只能指向預先定義好的函數代碼塊(可以是其他文件裡面定義,通 ...
相似點
1.函數指針和Block都可以實現回調的操作,聲明上也很相似,實現上都可以看成是一個代碼片段。
2.函數指針類型和Block類型都可以作為變數和函數參數的類型。(typedef定義別名之後,這個別名就是一個類型)
不同點
1.函數指針只能指向預先定義好的函數代碼塊(可以是其他文件裡面定義,通過函數參數動態傳入的),函數地址是在編譯鏈接時就已經確定好的。
2.Block本質是Objective-C對象,是NSObject的子類,可以接收消息。
3.函數裡面只能訪問全局變數,而Block代碼塊不光能訪問全局變數,還擁有當前棧記憶體和堆記憶體變數的可讀性(當然通過__block訪問指示符修飾的局部變數還可以在block代碼塊裡面進行修改)。
4.從記憶體的角度看,函數指針只不過是指向代碼區的一段可執行代碼,而block實際上是程式運行過程中在棧記憶體動態創建的對象,可以向其發送copy消息將block對象拷貝到堆記憶體,以延長其生命周期。 關於第2點可以作一個實驗,在定義block之後打一個斷點,Cmd+R運行後,可以在調試視窗看到,block確實是一個對象,擁有isa指針。 另外,採用block寫法,gcc編譯出來可執行文件體積更大,這應該還是跟block是對象有關。