"Block"這個詞既指源代碼中的block語法,也指由block語法所生成的“值”。
1.Block的本質
首先你要知道Block是一個對象(為什么說block是一個對象呢,下面會有解釋。),Block的本質其實就是閉包功能在iOS上的實現(xiàn)。
- 那什么是閉包呢?
(以下解釋來自百度百科)
閉包就是能夠讀取其他函數內部的函數,也可以理解為“定義在函數內部的函數”。本質上,閉包是函數內部和函數外部連接的橋梁。
我們來具體解釋一下這句話:
我們都知道變量的作用域有全局變量和局部變量,在一個函數中我們可以訪問全局變量和定義在這個函數中的局部變量,但是在這個函數外部就不能夠訪問該函數中的局部變量了。
有什么方法可以在函數的外部訪問到該函數內的局部變量呢? 這里就用到了“閉包”。
寫一段代碼感受一下吧。
- (void(^)(void))fun1{
int a = 100;
return ^{NSLog(@"a = %d",a);} ;
}
// 調用fun1
[self fun1];
這樣可以在函數fun1外部 訪問函數fun1內部的變量a了。我們發(fā)現(xiàn)定義在fun1函數內部的這個函數沒有名字,所以閉包還有另一種說法叫做:
“帶有自動變量值的匿名函數?!?/p>
2.Block語法
下面介紹一下Block表達式語法
- 完整語法
^ 返回值類型 (參數列表){表達式}
^ int (int count) { return count +1;};
- 省略返回值類型
^ (參數列表) {表達式}
^ (int count){printf("%d",count);}
- 省略返回值類型 和 參數列表
^ {表達式}
^ {printf("BLOCK!!!”);}
3. Block用法
3.1. Block作為屬性
定義了一個 名為blockName的成員屬性
@property (nonatomic, copy) void(^blockName)(NSString *);
3.2. Block作為方法參數
// 定義方法
- (void)testBlock:(void(^)(NSString * blockParam))callBack{
callBack(@"在方法中 調用了block");
}
// 調用方法
[self testBlock:^(NSString *blockParam) {
NSLog(@"block回調 到這里了 -- %@",blockParam);
}];
3.3. Block作為方法返回值
- (void(^)(NSString * blockParam))blockAsRetrunValue{
void(^blockName)(NSString*) = ^(NSString * param) {
NSLog(@"%@",param);
};
return blockName;
}
結束語:以上是我在看《Objective-C高級編程 iOS與OS X多線程和內存管理》這本書對Block的總結。有不足的地方,歡迎指正。