一: 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后:
