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