1. 程式人生 > >Objective-C Block與函數指針比較

Objective-C Block與函數指針比較

其他 可執行文件 調試 objective 運行 obj 子類 函數指針 延長

相似點

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是對象有關。

Objective-C Block與函數指針比較