之前群上一个人问我block怎么用,他说虽然也工作半年多了,但是很少自己用block,我本想百度一个demo给他,但发现居然很少有关于block吧demo,所以自己特意简单写了一个。
先附上代码:<a href = "https://github.com/smileKH/HBBlock">HBBlock</a>
介绍一下主要的几个点:
1、block的基本使用
/**
* 1、block内部默认是不能修改外面的局部变量,但是可以通过_block关键字修饰来改变局部变量
* 2、block内部可以改变全局变量
*/
__block int a = 10;
void (^block1)() = ^{
//block内部可以访问外面的变量
NSLog(@"a = %d",a);
//默认情况下,block内部不能修改外面的局部变量
//给局部变量加上__block关键字,这个局部变量就可以在block内部修改了
a = 20;
NSLog(@"修改之后a = %d",a);
//默认可以对全局变量进行修改
NSLog(@"b = %d",++b);
};
block1();
2、block作为属性
//block作为属性实现
HBBlockClass *class = [[HBBlockClass alloc]init];
//一个参数
class.block1 = ^(NSString *str){
NSLog(@"str =%@",str);
};
//两个参数
class.block2 = ^(NSString *str,int a){
NSLog(@"str1 = %@ int = %d",str,a);
};
//实现方法
[class blockPropertyUse];
3、block作为方法才参数
//block作为方法参数实现
HBBlockClass *class = [[HBBlockClass alloc]init];
[class method1:^(int a, int b) {
NSLog(@"a = %d b = %d",a,b);
}];
[class parameterA:4 andParameterB:5 andReturn:^(int c) {
NSLog(@"c = %d",c);
}];
4、block作为返回值
//block作为方法的返回值
HBBlockClass *class = [[HBBlockClass alloc]init];
MyBlockReturnUse block = [class getBlock];
block();
5、对象类的.h文件
//block作为属性 第一步
typedef void(^MyBlockPropertyUse)(NSString *string);
typedef void (^MyBlockPropertyUse1)(NSString *str,int a);
//block作为参数 第一步
typedef void (^MyBlockParameterUse)(int a, int b);
typedef void (^MyBlockParameterUse1)(int c);
//block作为返回值
typedef void (^MyBlockReturnUse)(void);
@interface HBBlockClass : NSObject
//block作为属性 第二步
@property (nonatomic , strong)MyBlockPropertyUse block1;
@property (nonatomic , strong)MyBlockPropertyUse1 block2;
//block作为属性
-(void)blockPropertyUse;
//block作为方法的参数 第二步
-(void)method1:(MyBlockParameterUse)block3;
-(void)parameterA:(int)A andParameterB:(int)B andReturn:(MyBlockParameterUse1)block4;
//block作为返回值
-(MyBlockReturnUse)getBlock;
@end
6、对象类的.m文件
//block作为属性
-(void)blockPropertyUse{
self.block1(@"block作为属性被执行了");
self.block2(@"block还加了个别的东西",5);
NSLog(@"blockPropertyUse方法被调用了");
}
//block作为方法的参数 第二步
-(void)method1:(MyBlockParameterUse)block3{
NSLog(@"mothod1被执行了");
block3(3,4);//回调
}
-(void)parameterA:(int)A andParameterB:(int)B andReturn:(MyBlockParameterUse1)block4{
NSLog(@"block作为参数被执行了");
int c = 0;
c = A*B;
//回调
block4(c);
}
//block作为返回值
-(MyBlockReturnUse)getBlock{
return ^{
NSLog(@"getBlock被调用了");
};
}
END.