Block(代碼段)封裝了一段代碼,可以在任何時候執行。
Block可以作為函數參數或者函數返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:block是inline(內聯函數)的,並且默認情況下它對局部變量是只讀的。
蘋果官方建議盡量多用block.在多線程、異步任務、集合遍歷、集合排序、動畫轉場用的很多。
Block的定義:
int (^MySum) (int, int) = ^(int a, int b){
return a + b;
}
定義了一個叫MySum的block對象,它帶有兩個int參數,返回int類型,等號右邊是block的具體實現。
void test(){ //定義了一個block,這個block返回值是int類型,接收兩個int類型參數 int (^Sum) (int, int) = ^(int a, int b){ return a + b; }; int a = Sum(10, 11); NSLog(@"%i", a); }
void test2(){ //block可以訪問局部變量,但默認情況下不能修改 int c = 15; //使用__block關鍵字,變量可以在block中修改 __block int b = 25; MySum sum = ^(int a, int b){ NSLog(@"C is %i", c); b = 35; NSLog(@"B is %i", b); return a + b; }; NSLog(@"%i", sum(10, 10)); }在上一篇中我們實現了一個按鈕監聽器,這一篇我們使用block來實現按鈕監聽器。
#import在Button.h中我們定義了一個數據類型 void(^ButtonBlock) (Button *), 然後定義一個該類型的成員變量 ButtonBlock block;@class Button; typedef void (^ButtonBlock) (Button *); @interface Button : NSObject //這裡暫時用assign @property (nonatomic, assign) ButtonBlock block; //模擬按鈕點擊 - (void)click; @end
添加了一個成員方法 - (void)click;
#import "Button.h" @implementation Button - (void)click { _block(self); } @endButton.m文件中實現了 - (void)click方法
int main(int argc, const char * argv[]) { @autoreleasepool { Button *btn = [[[Button alloc] init] autorelease]; btn.block = ^(Button *btn){ NSLog(@"按鈕%@被點擊了", btn); }; //模擬按鈕點擊 [btn click]; } return 0; }最後在主函數中我們先獲取按鈕對象,然後給按鈕對象中的block對象賦值,最後在模擬按鈕點擊事件的觸發。
細心的朋友可能會發現,這裡定義的block和c語言中的指向函數的指針特別想,兩個對比如下:
int sum1(int a, int b){ return a + b; } void test3(){ //Block int(^sum)(int, int) = ^(int a, int b){ return a + b; }; //指向函數的指針 int (*sum1)(int, int) = sum1; //調用 sum(11, 11); sum1(10, 10); }
typedef int(^MySum) (int, int); typedef int (*sum2)(int, int);