block是一個(gè)對(duì)象度帮,可以捕獲外部變量稿存,是一個(gè)匿名函數(shù)瓣履,可以保存代碼塊。使用copy進(jìn)行修飾冕臭,因?yàn)橐婚_始處于靜態(tài)區(qū),當(dāng)調(diào)用外部變量的時(shí)候悯蝉,處于棧區(qū)托慨,因?yàn)闂^(qū)的內(nèi)容隨時(shí)可能被銷毀厚棵,通過copy進(jìn)入堆區(qū)進(jìn)行操作。block需要調(diào)用才能執(zhí)行狠轻,因?yàn)閒uncptr保存當(dāng)前代碼塊中的函數(shù)柿祈,需要通過funcptr方法調(diào)用躏嚎,才能進(jìn)行操作卢佣。因此block需要調(diào)用才能響應(yīng)。
block根據(jù)內(nèi)存分為3類:
- NSGlobalBlock戈鲁,在全局靜態(tài)區(qū)嘹叫。
- NSMallocBlock :處于堆區(qū)罩扇,有外部變量引入。
- NSStackBlock:處于棧區(qū)消约。
Block在使用中對(duì)于循環(huán)引用問題的解決方案:
- weak,strong操作
- 在外部定義一個(gè)三方變量a(self->block->a->self)用__block修飾,在block內(nèi)調(diào)用完畢后员帮,將a=nil,以次來打破循環(huán)捞高。
__block修飾的變量,捕獲到自己屬性里浓体,即聲明定義一個(gè)臨時(shí)變量命浴,對(duì)應(yīng)的是一個(gè)結(jié)構(gòu)體贱除,此結(jié)構(gòu)體存放的是原有變量的值和地址,調(diào)用執(zhí)行后,輸出的其實(shí)是這個(gè)臨時(shí)變量指針對(duì)應(yīng)的內(nèi)容扯躺。值會(huì)隨著原有變量的變化而變化录语。 - 通過block傳參形式進(jìn)行操作。