Block的介紹
-
對(duì)象與對(duì)象之間的通信方式
- 代理-協(xié)議,通知,Block。
- 三種通信方式都實(shí)現(xiàn)了對(duì)象之間的解耦合。
- 通知的通信方式是1對(duì)多。
- 代理、Block是1對(duì)1。
-
Block介紹
- Block是iOS4.0之后新增的一種語(yǔ)法結(jié)構(gòu),也稱(chēng)為“閉包”。
- Block是一個(gè)匿名的函數(shù)代碼塊,此代碼塊可以作為參數(shù)傳遞給其他對(duì)象。
- 可以把block當(dāng)做Objective-C的匿名函數(shù),block是OC中的一種數(shù)據(jù)類(lèi)型,
^是block的特有標(biāo)記。
-
Block格式說(shuō)明
-
(返回類(lèi)型)(^block名稱(chēng))(參數(shù)類(lèi)型)=^(參數(shù)列表){代碼實(shí)現(xiàn)};。 - 如果沒(méi)有參數(shù),等號(hào)后面參數(shù)列表的()可以省略。
-
Block的使用
- Block 的定義

定義Block的常見(jiàn)兩種方式
- Block的3種類(lèi)型
- 不管在ARC還是MRC環(huán)境下,block內(nèi)部如果沒(méi)有訪問(wèn)外部變量,這個(gè)block是全局block
__NSGlobalBlock__,形式類(lèi)似函數(shù),存儲(chǔ)在內(nèi)存中的代碼區(qū)。 - 在MRC下,block內(nèi)部如果訪問(wèn)外部變量,這個(gè)block是棧block
__NSStackBlock__,存儲(chǔ)在內(nèi)存中的棧上。 - 在MRC下,block內(nèi)部訪問(wèn)外部變量,同時(shí)對(duì)該block做一次copy操作,這個(gè)block是堆block
__NSMallocBlock__,存儲(chǔ)在內(nèi)存中的堆上。 - 在ARC下,block內(nèi)部如果訪問(wèn)外部變量,這個(gè)block是堆block
__NSMallocBlock__,存儲(chǔ)在內(nèi)存中的堆上,因?yàn)樵贏RC下,默認(rèn)對(duì)block做了一次copy操作。
- 不管在ARC還是MRC環(huán)境下,block內(nèi)部如果沒(méi)有訪問(wèn)外部變量,這個(gè)block是全局block

全局block

棧block

堆block
- Block作為方法的參數(shù)
- 將block作為方法的參數(shù),可以用block來(lái)封裝代碼塊。

block作為方法的參數(shù)
- Block作為屬性

block作為屬性
- Block的方式遍歷數(shù)組\字典

block的方式遍歷數(shù)組\字典
Block的使用注意
- Block訪問(wèn)外部變量
- block內(nèi)部可以訪問(wèn)外部的變量,block默認(rèn)是將其復(fù)制到其數(shù)據(jù)結(jié)構(gòu)中來(lái)實(shí)現(xiàn)訪問(wèn)的。
- 默認(rèn)情況下,block內(nèi)部不能修改外面的局部變量,因?yàn)橥ㄟ^(guò)block進(jìn)行閉包的變量是const的。
- 給局部變量加上
__block關(guān)鍵字,這個(gè)局部變量就可以在block內(nèi)部修改,block是復(fù)制其引用地址來(lái)實(shí)現(xiàn)訪問(wèn)的。

block訪問(wèn)外部變量
- Block作為屬性應(yīng)該用copy修飾
- 當(dāng)用weak、assign修飾block屬性時(shí),block訪問(wèn)外部變量,此時(shí)block的類(lèi)型是棧block。保存在棧中的block,當(dāng)block所在函數(shù)\方法返回\結(jié)束,該block就會(huì)被銷(xiāo)毀。在其他方法內(nèi)部調(diào)用訪問(wèn)該block,就會(huì)引發(fā)野指針錯(cuò)誤
EXC_BAD_ACCESS。 - 當(dāng)用copy、strong修飾block屬性時(shí),block訪問(wèn)外部變量,此時(shí)block的類(lèi)型是堆block。保存在堆中的block,當(dāng)引用計(jì)數(shù)器為0時(shí)被銷(xiāo)毀,該類(lèi)型block是由棧類(lèi)型的block從棧中復(fù)制到堆中形成的,因此可以在其他方法內(nèi)部調(diào)用該block。在ARC下,
strong和copy都可以用來(lái)修飾block,但是建議修飾block屬性使用copy。
- 當(dāng)用weak、assign修飾block屬性時(shí),block訪問(wèn)外部變量,此時(shí)block的類(lèi)型是棧block。保存在棧中的block,當(dāng)block所在函數(shù)\方法返回\結(jié)束,該block就會(huì)被銷(xiāo)毀。在其他方法內(nèi)部調(diào)用訪問(wèn)該block,就會(huì)引發(fā)野指針錯(cuò)誤

weak修飾block

copy修飾block