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的幾種寫(xiě)法
1.聲明一個(gè)block變量。--箭頭在中間
returnType (^blockName)(parameterTypes);//定義了一個(gè)blockName的block
如 void^myBlock (int);
還可以先定義一個(gè)block的類(lèi)型:
typedef returnType (^BlockType)(parameterTypes);//定義了一個(gè)類(lèi)型為BlockType的block類(lèi)型梆惯。
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)雅的感覺(jué),此外怯屉,它還給編程帶來(lái)一種一致感蔚舀,便于維護(hù)饵沧。這種編程風(fēng)格讓我們更直觀的感受到對(duì)對(duì)象狀態(tài)的操作。
Objective-C是采用[objc method]這種方式來(lái)調(diào)用方法赌躺。要實(shí)現(xiàn)objc.method1().method2()....
1.getter方法block狼牺,將block聲明為getter方法的樣式就可以使用點(diǎn)語(yǔ)法,重寫(xiě)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被釋放余寥,其他地方引用不到的問(wèn)題。
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沒(méi)有引用外部對(duì)象(外部基本類(lèi)型的變量不算)的話(huà),就存儲(chǔ)在全局區(qū)恍风,否則存儲(chǔ)在堆區(qū)蹦狂。