block是iOS4.0之后新增的特性,现在我们看案列代码都能够看到block的应用。最普遍的就是用作回调。
一.关于block的一些基础信息
1.建立block,看下面两个例子
void (^block)(void); //这是一个参数void,返回值void的block
void (^block)(int a, char b); //这是一个参数是int和char,返回值void的block
所以记住 ^用来声明一个block
再看几个例子:
1)
int (^block)(int) = ^int(int num) {
return num*3;
};
int a=block(3); //9
2)
int (^block)(int);
block = ^int(int num) {
return num*3;
};
int a=block(3); //9
其实1)等同于2)
2.修改声明在block之外的变量
1)
int x = 123;
int (^block) (int) =^int(int num){
num = x+num;
return num;
};
int a=block(3); //126
2)注意这个是错误示范
int x = 123;
int (^block) (int) =^int(int num){
x = x+num;
return x;
};
3)
__block int x = 123;
int (^block) (int) =^int(int num){
x = x+num;
return x;
};
int a=block(3); //126
2)和3)说明要想修改block之外定义的变量需要加__block
二.下面说说在iOS开发上作为回调功能的应用
拿案例说明
功能很简单,就是点击按钮触发block,改变Label的文字或背景颜色
1.第一步当然是新建工程,然后在IB中拖几个按钮,链接到不一样的方法,再拖一个UILabel建立与代码的联系,这个大家都懂
2.第二步增加两个文件ChangeColor.h和ChangeColor.m
案列一,点击按钮,Label背景变绿色
ChangeColor.h中
typedef void(^GreenColor)(UIColor *colorGreen);
+ (void)ChangeToGreen:(GreenColor)block;
ChangeColor.m中
+ (void)ChangeToGreen:(GreenColor)block{
UIColor *color = [UIColor greenColor];
block(color);
}
ViewController.m相应的按钮方法中
[ChangeColor ChangeToGreen:^(UIColor *colorGreen) {
label.backgroundColor = colorGreen;
}];
案列二,Label背景变蓝
ChangeColor.h中
+ (void)ChangeToBlue:(void(^)(UIColor *colorBlue))block;
ChangeColor.m中
+ (void)ChangeToBlue:(void (^)(UIColor *))block{
UIColor *color = [UIColor blueColor];
block(color);
}
ViewController.m相应的按钮方法中
[ChangeColor ChangeToBlue:^(UIColor *colorBlue) {
label.backgroundColor = colorBlue;
}];
案例一和二的区别就在于typedef,先定义了block
案例三,Label背景变红,并改变文字
ChangeColor.h中
+ (
void
)ChangeToRedAndNewText:(
void
(^)(
UIColor
*colorRed,
NSString
*text))block;
ChangeColor.m中
+ (void)ChangeToRedAndNewText:(void (^)(UIColor *, NSString *))block{
UIColor *color = [UIColor redColor];
NSString *string = @"xxxxxxx";
block(color,string);
}
ViewController.m相应的按钮方法中
[ChangeColor ChangeToRedAndNewText:^(UIColor *colorRed, NSString *text) {
label.backgroundColor = colorRed;
label.text = text;
}];
案例三和之前两个案例的区别是block的参数两个
案列四,Label背景变棕色,文字改变
ChangeColor.h中
+ (void)ChangeWithText:(NSString *)text CallBlock:(void(^)(UIColor *colorBrown, NSString *newText))block;
ChangeColor.m中
+ (void)ChangeWithText:(NSString *)text CallBlock:(void (^)(UIColor *, NSString *))block{
UIColor *color = [UIColor brownColor];
block(color,text);
}
ViewController.m相应的按钮方法中
[ChangeColor ChangeWithText:@"aaaaa" CallBlock:^(UIColor *colorBrown, NSString *newText) {
label.backgroundColor = colorBrown;
label.text = newText;
}];
案列四中的类方法中有一个参数是
(
NSString
*)text,另一个就是block。所以在回调中,block可以理解为作为参数在使用。
案列五,点击按钮,执行的block参数返回值都是void
ChangeColor.h中
+ (void)NoChange:(void (^)(void))block;
ChangeColor.m中
+ (void)NoChange:(void (^)(void))block{
block();
}
ViewController.m相应的按钮方法中
[ChangeColor NoChange:^{
NSLog(@"NoChange");
}];
案例六,点击的按钮执行的block带返回值
ChangeColor.h中
+ (void)Change:(int (^)(int num))block;
ChangeColor.m中
+ (void)Change:(int (^)(int))block{
int a = block(3);
NSLog(@"%d",a);
}
ViewController.m相应的按钮方法中
[ChangeColor Change:^int(int num) {
return num*3;
}];
案例六,执行后会打印9
,
这从一到六的案例只是简单地展示了一下block在回调上的应用