block的代碼是內(nèi)聯(lián)的窖认,效率高于函數(shù)調(diào)用
block對于外部變量默認是只讀屬性
block被Objective-C看成是對象處理
block的代碼結(jié)構(gòu)
舉個簡單例子:
int (^sumNumbers)(int a,int b) = ^(int a,int b) {
return a + b;
};
這段代碼等號左側(cè)聲明一個名為sumNumbers的代碼塊,名稱前用^符號表示后面的字符串是block的名稱赦拘。最左側(cè)的int表示這個block的返回值類型茫打,括號中間表示這個block的參數(shù)列表累贤,這里接收兩個int類型的參數(shù)狱杰。 而在等號右側(cè)表示這個block的定義,其中返回值是可以省略的期奔,編譯器會根據(jù)上下文自動補充返回值類型豆拨。使用^符號銜接著一個參數(shù)列表,使用括號包起來能庆,告訴編譯器這是一個block,然后使用大括號將block的代碼封裝起來脚线。
block在捕獲變量的時候只會保存變量被捕獲時的狀態(tài)(對象變量除外)搁胆,之后即便變量再次改變,block中的值也不會發(fā)生改變
block對于外部變量是只讀的邮绿,想要在block內(nèi)部修改外部變量渠旁,外部變量需要加__block修飾,block在iOS開發(fā)中被視作是對象船逮,因此其生命周期會一直等到持有者的生命周期結(jié)束了才會結(jié)束顾腊。另一方面,由于block捕獲變量的機制挖胃,使得持有block的對象也可能被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)的方式進行block的聲明未免麻煩了些,我們可以通過關(guān)鍵字typedef來為block起類型名稱织堂,然后直接通過類型名進行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;