圖片來自網絡
之前群上一個人問我block怎么用,他說雖然也工作半年多了,但是很少自己用block,我本想百度一個demo給他,但發現居然很少有關于block吧demo,所以自己特意簡單寫了一個。
先附上代碼:<a >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.