iOS開發之代碼塊的使用

Block的實際行爲和Function很像,最大的差別是在可以存取同一個Scope的變量值。Block實體形式如下:

^(傳入參數列){行爲主體};

Block實體開頭是“^”,接着是由小括號所包起來的參數列(比如 int a, int b, int c),行爲主體由大括號包起來,專有名字叫做block literal。行爲主體可以用return回傳值,類型會被compiler自動辨別。如果沒有參數列要寫成: ^(void)。或者省略(void)只適用^{行爲主體}.

定義代碼塊類型

定義一個代碼塊類型如下:

//如果你不加形參a,b也不會報錯,我們最好加上,這樣可讀性更強
typedef void(^Myblock)(int a,int b);

我們定義了一個名爲Myblock的代碼塊類型

使用代碼塊類型定義屬性

@property(nonatomic,readwrite,copy) Myblock block1;

聲明方法參數

//代碼塊類型作爲形參,只能傳遞返回值爲void類型的代碼塊,也就是說 void(^Myblock)(int a,int b)中的void不能是int或其他類型
-(void)finish:(Myblock)block;

聲明一個代碼塊變量

 //block是一個代碼塊變量,=的右邊則是代碼塊對象實體
 Myblock block = ^(int a,int b){NSLog(@"a+b = %d",a+b);};
 block(100,200);

不定義代碼塊類型直接使用

定義屬性

@property(nonatomic,readwrite,copy) int(^block2)(int,int);

定義了一個名爲block2的代碼塊屬性

定義參數

-(void)finish:(void (^)(int a,int b))block;

定義參數只需要給^加上括號就好了,其實void (^)(int a,int b)就是block類型

定義變量

void (^text)() = ^{NSLog(@"aaaa111");};
text();

這裏定義了一個text的代碼塊變量,注意此處的代碼塊的實體就是省略了^(void)中的(void)

發佈了126 篇原創文章 · 獲贊 31 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章