Block的使用


Block的介紹

  • 對(duì)象與對(duì)象之間的通信方式

    1. 代理-協(xié)議,通知,Block
    2. 三種通信方式都實(shí)現(xiàn)了對(duì)象之間的解耦合。
    3. 通知的通信方式是1對(duì)多。
    4. 代理、Block是1對(duì)1
  • Block介紹

    1. Block是iOS4.0之后新增的一種語(yǔ)法結(jié)構(gòu),也稱(chēng)為“閉包”。
    2. Block是一個(gè)匿名的函數(shù)代碼塊,此代碼塊可以作為參數(shù)傳遞給其他對(duì)象。
    3. 可以把block當(dāng)做Objective-C的匿名函數(shù),block是OC中的一種數(shù)據(jù)類(lèi)型,^是block的特有標(biāo)記。
  • Block格式說(shuō)明

    1. (返回類(lèi)型)(^block名稱(chēng))(參數(shù)類(lèi)型)=^(參數(shù)列表){代碼實(shí)現(xiàn)};。
    2. 如果沒(méi)有參數(shù),等號(hào)后面參數(shù)列表的()可以省略。

Block的使用

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

棧block

堆block
  • Block作為方法的參數(shù)
    • 將block作為方法的參數(shù),可以用block來(lái)封裝代碼塊。
block作為方法的參數(shù)
  • Block作為屬性
block作為屬性
  • Block的方式遍歷數(shù)組\字典
block的方式遍歷數(shù)組\字典

Block的使用注意

  • Block訪問(wèn)外部變量
    1. block內(nèi)部可以訪問(wèn)外部的變量,block默認(rèn)是將其復(fù)制到其數(shù)據(jù)結(jié)構(gòu)中來(lái)實(shí)現(xiàn)訪問(wèn)的。
    2. 默認(rèn)情況下,block內(nèi)部不能修改外面的局部變量,因?yàn)橥ㄟ^(guò)block進(jìn)行閉包的變量是const的。
    3. 給局部變量加上__block關(guān)鍵字,這個(gè)局部變量就可以在block內(nèi)部修改,block是復(fù)制其引用地址來(lái)實(shí)現(xiàn)訪問(wèn)的。
block訪問(wèn)外部變量
  • Block作為屬性應(yīng)該用copy修飾
    1. 當(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
    2. 當(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下,strongcopy都可以用來(lái)修飾block,但是建議修飾block屬性使用copy。
weak修飾block
copy修飾block

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一,首先介紹什么是Block?它就是一個(gè)(里面存儲(chǔ)了 指向函數(shù)體中包含定義block時(shí)的代碼塊的函數(shù)指針,以及bl...
    獻(xiàn)國(guó)閱讀 1,510評(píng)論 0 0
  • Block 是一種特殊的數(shù)據(jù)類(lèi)型,默認(rèn)存儲(chǔ)在棧中,若對(duì)Block 進(jìn)行一次Copy 則Block會(huì)進(jìn)入堆中 1.B...
    金克拉拉拉拉閱讀 1,328評(píng)論 0 1
  • 《Objective-C高級(jí)編程》這本書(shū)就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 10,117評(píng)論 10 69
  • block的聲明和簡(jiǎn)單使用 蘋(píng)果官方文檔聲明,block是objc對(duì)象。 block的定義方式 無(wú)返回值無(wú)參數(shù)的b...
    eightzg閱讀 6,594評(píng)論 1 4
  • 在編程領(lǐng)域里,一個(gè)牛逼程序員和一個(gè)二逼程序員之間的區(qū)別主要是其對(duì)所用編程語(yǔ)言?xún)?yōu)秀特性的運(yùn)用方式。要說(shuō)到Object...
    Jimmy_L_Wang閱讀 611評(píng)論 0 1

友情鏈接更多精彩內(nèi)容