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