Objc_Block

block的內(nèi)存模型

block的內(nèi)存模型是一個結(jié)構(gòu)體,其中有兩個字段。一個是isa,代表block是一個對象,另外這個對象里面有一個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.聲明一個block變量。--箭頭在中間

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

如 void^myBlock (int);

還可以先定義一個block的類型:

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

BlockType myBlock; //定義了一個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實現(xiàn)鏈式編程

鏈式編程給人一種優(yōu)雅的感覺,此外,它還給編程帶來一種一致感,便于維護。這種編程風格讓我們更直觀的感受到對對象狀態(tài)的操作。

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

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

2,block返回對象本身。

Block的copy關(guān)鍵字

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

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

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

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

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

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

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

  • 前言 Blocks是C語言的擴充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,863評論 0 23
  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 815評論 2 1
  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,467評論 2 26
  • 本篇筆記大部分參考于Block和鏈式編程感謝原作者。本筆記僅在細節(jié)上做補充。 綜述 使用場景:對象調(diào)用了一個方法想...
    黑羽肅霜閱讀 416評論 0 0
  • 立志成才是以強健的身體,旺盛的精力作前提,如果沒有這個前提,才能杰出也無用,只有使自己成為品德,健康,才能三...
    Miulps喵大人閱讀 307評論 0 0

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