block的感覺是越用越喜歡,下面就簡單說說她的基本使用,block基本有下面四種情況。
- 1.無參數無返回值
//1,無參數,無返回值,聲明和定義
void (^MyBlock)(void) = ^(void){
NSLog(@"無參數,無返回值");
};
MyBlock();//block的調用
- 2.有參數無返回值
//2,有參數,無返回值,聲明和定義
void (^MyblockTwo)(int a) = ^(int a){
NSLog(@"@ = %d我就是block,有參數,無返回值",a);
};
MyblockTwo(100);//block的調用
- 3.有參數有返回值
//3,有參數,有返回值
int (^MyBlockThree)(int, int) = ^(int a,int b){
NSLog(@"%d我就是block,有參數,有返回值",a + b);
return a + b;
};
MyBlockThree(12,56);
- 4.無參數有返回值(很少用到)
//4,無參數,有返回值
int (^MyblockFour)(void) = ^{
NSLog(@"無參數,有返回值");
return 45;
};
MyblockFour();
局部block
就像上面舉的幾個例子,都是局部的block,這種局部的block我們實際開發中也基本上用不到,這個和(本類代理有點像,就是自己委托自己實現什么,感覺比較奇葩),我們用block往往定義全局的,并且是實現傳值的作用,或者絕大部分功能能夠取代代理(delegate)下面上demo;
下面需要實現這么一個功能:A,B兩個界面,A界面中有一個label,一個buttonA,點擊buttonA進入B界面,B界面中有一個UITextfield和一個buttonB,點擊B界面將B中UITextfield的值傳到A界面中的label中效果如下圖:
block.gif
關鍵代碼(界面的搭建主要用xib):
A界面中,也就是ViewController類中;
//關鍵demo:
- (IBAction)buttonAction {
MyFirstViewController *myVC = [[MyFirstViewController alloc] init];
[self presentViewController:myVC animated:YES completion:^{
}];
__weak typeof(self) weakSelf = self;//防止循環引用
//用屬性定義的注意:這里屬性是不會自動補全的,方法就會自動補全
[myVC setBlock:^(NSString *string){
weakSelf.labelA.text = string;
}];
}
B界面中,也就是MyFirstViewController類中.m文件:
- (IBAction)buttonBAction {
[self dismissViewControllerAnimated:YES completion:^{
}];
self.block(_myTextfielf.text);
}
.h文件:
#import <UIKit/UIKit.h>
//typedef定義一下block,為了更好用
typedef void(^MyBlock)(NSString *string);
@interface MyFirstViewController : UIViewController
@property (nonatomic, copy) MyBlock block;
@end
以上,是不是感覺比delegate清爽了不少,其實代碼量也差不多了,到底用delegate還是block關鍵就看心情了。
更多細節請參考:
iOS-Block的使用你看我啊
iOS開發-由淺至深學習block