ios block用法與分析

一: block的基礎(chǔ)用法

block聲明: int(^blockDemon)(inta,intb) ,

其中int : 為返回值,

blockDemon: 為block變量名稱,

(int a, int b): 為block接收參數(shù)

block實(shí)現(xiàn):^(int a, int b){

? ? ? ? ? ?returna + b;

}


截獲自動(dòng)變量值:

block會(huì)自動(dòng)保存變量的瞬間值,盡管對(duì)變量進(jìn)行重新賦值操作,block 內(nèi)部依舊會(huì)保存變量原先值

__block說(shuō)明符號(hào):

自動(dòng)變量截獲的值為block聲明時(shí)刻的瞬間值,保存后就不能改寫該值(但可讀),如需對(duì)自動(dòng)變量進(jìn)行重新賦值,需要在變量聲明前附加__block說(shuō)明符,這時(shí)該變量稱為_(kāi)_block變量。

自動(dòng)變量值為一個(gè)對(duì)象的特殊情況(沒(méi)有使用__block),當(dāng)自動(dòng)變量為一個(gè)類的對(duì)象,且沒(méi)有使用__block修飾時(shí),雖然不可以在Block內(nèi)對(duì)該變量進(jìn)行重新賦值,但可以修改該對(duì)象的屬性。

二: block的循環(huán)引用

最簡(jiǎn)單的例子:

[self.teacher?requestData:^(NSData?*data)?{

????self.name?=?@"case";

}];

self強(qiáng)引用了teacher,而teacher又強(qiáng)引用了一個(gè)block,而block在回調(diào)時(shí)又強(qiáng)引用了self,形成一個(gè)保留環(huán),即self-->teacher-->block-->self,最終導(dǎo)致內(nèi)存泄露。

一般的解決辦法:

__weak?typeof(self)?weakSelf?=?self;

????[self.teacher?requestData:^(NSData?*data)?{

????????typeof(weakSelf)?strongSelf?=?weakSelf;

???????strongSelf.name?=?@"case";

????}];

通過(guò)__weak修飾符,這樣就打破了保留環(huán),即self-->teacher-->block-->weakSelf。

三: block的結(jié)構(gòu)與實(shí)質(zhì)

使用block的時(shí)候,編譯器對(duì)block做了什么:

經(jīng)過(guò)分析工具clang后:

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

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

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