Objc_Block

block的內(nèi)存模型

block的內(nèi)存模型是一個(gè)結(jié)構(gòu)體,其中有兩個(gè)字段。一個(gè)是isa,代表block是一個(gè)對(duì)象,另外這個(gè)對(duì)象里面有一個(gè)imp,執(zhí)行block執(zhí)行的代碼。

id imp_getBlock(IMP anImp);//獲取IMP是anImp的Block。

Bool imp_removeBlock(IMP anImp);//解除block與imp的關(guān)聯(lián)。

IMP imp_implementationWithBlock ( id block );//獲取block的IMP。

block的幾種寫法

1.聲明一個(gè)block變量。--箭頭在中間

returnType (^blockName)(parameterTypes);//定義了一個(gè)blockName的block

如 void^myBlock (int);

還可以先定義一個(gè)block的類型:

typedef returnType (^BlockType)(parameterTypes);//定義了一個(gè)類型為BlockType的block類型。

BlockType myBlock; //定義了一個(gè)myBlock變量。

2,給block變量賦值

returnType(^blockName)(parameterTypes) = ^returnType(parameters) {...};

3,block作為形參

- (void) testBlock: returnType(^)(parameterTypes)blockName;

4,block作為返回值

-(returnType(^)(parameterTypes))block{

? ? return returnType(^)(parameterTypes){

? ? ? ? ? //........ ??

? ? ? ? ? ?return returnType;

? ?};

}

block實(shí)現(xiàn)鏈?zhǔn)骄幊?/h1>

鏈?zhǔn)骄幊探o人一種優(yōu)雅的感覺,此外,它還給編程帶來一種一致感,便于維護(hù)。這種編程風(fēng)格讓我們更直觀的感受到對(duì)對(duì)象狀態(tài)的操作。

Objective-C是采用[objc method]這種方式來調(diào)用方法。要實(shí)現(xiàn)objc.method1().method2()....

1.getter方法block,將block聲明為getter方法的樣式就可以使用點(diǎn)語法,重寫block的getter方法,在block里面處理業(yè)務(wù)邏輯,外界只傳入?yún)?shù)。

2,block返回對(duì)象本身。

Block的copy關(guān)鍵字

? ? ? ?一般block是在棧區(qū)創(chuàng)建的,當(dāng)函數(shù)執(zhí)行完畢,棧區(qū)上的對(duì)象就會(huì)被釋放。賦值給copy關(guān)鍵字修飾的對(duì)象的時(shí)候,會(huì)將block在堆內(nèi)存中copy一份,避免彈棧導(dǎo)致block被釋放,其他地方引用不到的問題。

Block所在的內(nèi)存區(qū)域。

理論上Block在內(nèi)存中的存儲(chǔ)位置有三種,棧區(qū)(StackBlock),堆區(qū)(MallocBlock),全局區(qū)(GlobalBlock)。

但是在ARC的環(huán)境下,棧區(qū)的block會(huì)自動(dòng)copy到堆區(qū),因此,ARC的環(huán)境下,Block的內(nèi)存位置只有堆區(qū)和全局區(qū)。

其中,如果Block沒有引用外部對(duì)象(外部基本類型的變量不算)的話,就存儲(chǔ)在全局區(qū),否則存儲(chǔ)在堆區(qū)。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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