Block簡單使用

block的代碼是內聯的,效率高于函數調用

block對于外部變量默認是只讀屬性

block被Objective-C看成是對象處理

block的代碼結構

舉個簡單例子:

int (^sumNumbers)(int a,int b) = ^(int a,int b) {

return a + b;

};

這段代碼等號左側聲明一個名為sumNumbers的代碼塊,名稱前用^符號表示后面的字符串是block的名稱。最左側的int表示這個block的返回值類型,括號中間表示這個block的參數列表,這里接收兩個int類型的參數。 而在等號右側表示這個block的定義,其中返回值是可以省略的,編譯器會根據上下文自動補充返回值類型。使用^符號銜接著一個參數列表,使用括號包起來,告訴編譯器這是一個block,然后使用大括號將block的代碼封裝起來。

block代碼結構

block在捕獲變量的時候只會保存變量被捕獲時的狀態(對象變量除外),之后即便變量再次改變,block中的值也不會發生改變

block對于外部變量是只讀的,想要在block內部修改外部變量,外部變量需要加__block修飾,block在iOS開發中被視作是對象,因此其生命周期會一直等到持有者的生命周期結束了才會結束。另一方面,由于block捕獲變量的機制,使得持有block的對象也可能被block持有,從而形成循環引用,導致兩者都不能被釋放

__weak typeof(self) weakSelf = self;

__weak__typeof(self)weakSelf=self;

__weak typeof(&*self)weakSelf=self;

__weak__typeof(&*self)weakSelf=self;

按照returnValue(^blockName)(parameters)的方式進行block的聲明未免麻煩了些,我們可以通過關鍵字typedef來為block起類型名稱,然后直接通過類型名進行block的創建:

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;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容