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