block的代碼是內(nèi)聯(lián)的,效率高于函數(shù)調(diào)用
block對(duì)于外部變量默認(rèn)是只讀屬性
block被Objective-C看成是對(duì)象處理
block的代碼結(jié)構(gòu)
舉個(gè)簡(jiǎn)單例子:
int (^sumNumbers)(int a,int b) = ^(int a,int b) {
return a + b;
};
這段代碼等號(hào)左側(cè)聲明一個(gè)名為sumNumbers的代碼塊,名稱前用^符號(hào)表示后面的字符串是block的名稱。最左側(cè)的int表示這個(gè)block的返回值類型,括號(hào)中間表示這個(gè)block的參數(shù)列表,這里接收兩個(gè)int類型的參數(shù)。 而在等號(hào)右側(cè)表示這個(gè)block的定義,其中返回值是可以省略的,編譯器會(huì)根據(jù)上下文自動(dòng)補(bǔ)充返回值類型。使用^符號(hào)銜接著一個(gè)參數(shù)列表,使用括號(hào)包起來(lái),告訴編譯器這是一個(gè)block,然后使用大括號(hào)將block的代碼封裝起來(lái)。

block在捕獲變量的時(shí)候只會(huì)保存變量被捕獲時(shí)的狀態(tài)(對(duì)象變量除外),之后即便變量再次改變,block中的值也不會(huì)發(fā)生改變
block對(duì)于外部變量是只讀的,想要在block內(nèi)部修改外部變量,外部變量需要加__block修飾,block在iOS開(kāi)發(fā)中被視作是對(duì)象,因此其生命周期會(huì)一直等到持有者的生命周期結(jié)束了才會(huì)結(jié)束。另一方面,由于block捕獲變量的機(jī)制,使得持有block的對(duì)象也可能被block持有,從而形成循環(huán)引用,導(dǎo)致兩者都不能被釋放
__weak typeof(self) weakSelf = self;
__weak__typeof(self)weakSelf=self;
__weak typeof(&*self)weakSelf=self;
__weak__typeof(&*self)weakSelf=self;
按照returnValue(^blockName)(parameters)的方式進(jìn)行block的聲明未免麻煩了些,我們可以通過(guò)關(guān)鍵字typedef來(lái)為block起類型名稱,然后直接通過(guò)類型名進(jìn)行block的創(chuàng)建:
typedef void(^TestOneBlock)(NSString *str, NSArray *arr);
typedef void(^TestTwoBlock)(NSString *str, NSArray *arr);
- (void)completeWithBlock:(TestOneBlock)block;
- (void)completeWithHandle:(TestTwoBlock)block;
@property (copy, nonatomic) TestOneBlock oneBlock;
@property (copy, nonatomic) TestTwoBlock twoBlock;