Objective-C Block與函數指針比較
阿新 • • 發佈:2018-09-21
其他 可執行文件 調試 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與函數指針比較