IOS《Block》
Block:
(ios.4.0系统就开始支持Block),在编译的过程中被看成对象,他封装了一段代码,这段代码可以在任何时候执行。
在OC中通常使用block实现代理方法实现功能,也就是回调:
typedef void (^MyBlock)(int num); @property (weak,nonatomic) MyBlock block; -(void)setMyBlock:(void(^)(int num))block; //实现 -(void)setMyBlock:(void(^)(int num))block{ if(block){ self.block = block; } }
也可以作为方法直接回调--返回值(和上述同一概念,编译过程看成对象):
// 通用基础文件(作为网络请求) -(void)post:(NSString *)url parameters:(NSDictionary *)parameters dataModel:(Class)dataModel successHandler:(void(^)(id model))successBlock errorHandler:(void(^)(NSString *code,NSString *message))errorBlock;
通过上面两段代码,我们现在统一一下block的定义格式:
返回值类型(^block变量名)(形参列表) = ^(形参列表){};
block可大致分为3中类型:
1.无参数无返回值:
//无参数,无返回值的Block -(void)No_ParametersAndReturnValues_Block{ void (^emptyBlock)() = ^(){ NSLog(@"无参数,无返回值的Block"); }; emptyBlock(); }
2.有参数无返回值:
//有参数,无返回值的Block -(void)HaveParameters_NoReturnValues_Block{ void (^HpNrBlock)(int,int) = ^(int a,int b){ NSLog(@"%d + %d = %d",a,b,a+b); }; HpNrBlock(5,5); }
3.有参数有返回值:
//有参数,有返回值的Block -(void)Have_ParametersAndReturnValues_Block{ int multiplier = 7 ; int (^HpHrBlock)( int ) = ^( int num){ return num * multiplier; }; NSLog(@"%d" , HpHrBlock( 3 )); //结果会打印出21 }
PS:__block是一种特殊类型,使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。
以上都是很常见的Block使用方法和格式。
补充一下第一个结合typedef使用的Block吧:
在ViewControllerB中定义一个Block(带参数,无返回值):
VB.h:
typedef void(^colorBlock)(id); @interface ViewControllerB : UIViewController @property (copy,nonatomic) colorBlock colors;
VB.m:
UIColor *color = [UIColor redColor];
self.colors(color);
VC.m:
ViewControllerB *VCB = [[ViewControllerB alloc]init]; VCB.colors = ^(UIColor *color){ self.view.backgroundColor = color; };
在VB中定义一个Block类型,用定义的类型去创建Block,上述事例是Block回调修改上一个界面的背景颜色,控制器VC跳转到控制器VB,然后在控制器VB触发事件回调修改控制器VC的背景颜色。
关于Block的其他修饰和使用范畴在这里就没有过多的深究了。
-----辉小鱼