block常用的場景:
- 當做屬性傳值
- 當做方法的參數(shù)回調(diào)
- 當做方法的返回值使用
前面2種比較常見,也比較容易使用秦踪,第3種很少見褐捻,運用的比較高深,可以將代碼發(fā)展成鏈式編程椅邓。后面詳細講解下第3種用法以及它是如何實現(xiàn)的柠逞。
1、正常定義一個方法如下所示
- (void)blockTest {
NSLog(@"blockTest");
}
在viewDidLoad方法中直接調(diào)用
self.blockTest;
運行結果:
運行結果.png
2景馁、將blockTest這個方法的返回值變成一個block板壮,如下所示
- (void(^)())blockTest {
void(^block)() = ^{
NSLog(@"blockTest");
};
return block;
}
// 上面還可以簡寫成以下方式,代碼是一模一樣的合住,只是少了定義block
- (void(^)())blockTest {
return ^{
NSLog(@"blockTest");
};
}
然后在viewDidLoad中調(diào)用時就變成了如下
// 在方法后面多了一個()
self.blockTest()
// 上面的寫法就等于直接調(diào)用了一個block
^{
NSLog(@"blockTest");
}()
// 更好的理解寫法請看下面
void(^blockTest)() = ^{
NSLog(@"blockTest");
};
blockTest();
運行結果和步驟1的一樣绰精。
以上展現(xiàn)的一個思想就是將block分裝成了方法的返回值來使用,你調(diào)用的是一個方法透葛,實際就是定義一個block并馬上調(diào)用這個block笨使。
3、接下來我們給這個block添加一個參數(shù)
- (void(^)(NSString *))blockTest {
return ^(NSString *name){
NSLog(@"blockTest --> %@",name);
};
}
在viewDidLoad中調(diào)用變成了
// 括號內(nèi)多了需要傳遞的參數(shù)
self.blockTest(@"doudou");
現(xiàn)在可以通過block傳遞參數(shù)了
4僚害、終極變形硫椰,鏈式編程
給block添加一個返回值,代碼變成了如下形式
// 因為返回值是當前的類萨蚕,所以在block代碼里需要return self
- (ViewController *(^)(NSString *))blockTest {
return ^(NSString *name){
NSLog(@"blockTest --> %@",name);
return self;
};
}
參照上面的方法靶草,然后再自定義一個方法yourName,如下
- (ViewController *(^)(NSString *))yourName {
return ^(NSString *name){
NSLog(@"yourName --> %@",name);
return self;
};
}
在viewDidLoad中進行調(diào)用
// 可以通過一個點(.)不斷的調(diào)用方法
self.blockTest(@"doudou").yourName(@"yiliu");
運行結果如下
運行結果.png
以上就是將block當做返回值的一個運行過程门岔。