前言
不要失去信心,只要坚持不懈,就终会有成果的。——钱学森
虽然block经常在使用,但是没正正经经整理梳理下用法,下面只是个人学习路上的记录,仅供参考。有问题还望指正。
block的声明
Block变量的声明格式为: 返回值类型(^Block名字)(参数列表);
//无返回值block
void(^aBlock)(NSString *x, NSString *y);
//形参变量可以省略,保留参数类型即可
void(^aBlock)(NSString *, NSString *);
//typedef类型定义
typedef void(^RLBlock)(NSString *str);
block的赋值
//赋值
aBlock = ^ (NSString *str1 ,NSString *str2){
NSLog(@"%@ %@",str1,str2);
};
//声明的同时进行赋值 申明 + 赋值
int(^myBlock)(int) = ^(int num){
return num * 7;
};
//如果没有参数列表,在赋值时参数列表可以省略 申明 + 赋值
void(^aVoidBlock)(void) = ^{
NSLog(@"I am a aVoidBlock");
};
block的调用
aBlock(@"Do You Like This?" ,@"YES,I Do!");
NSLog(@"计算结果 : %d",myBlock(6));
//如果没有参数列表,在赋值时参数列表可以省略 申明 + 赋值
void(^aVoidBlock)(void) = ^{
NSLog(@"I am a aVoidBlock");
};
//调用
aVoidBlock();
/**
在实际使用Block的过程中,我们可能需要重复地声明多个相同返回值相同参数列表的Block变量,
如果总是重复地编写一长串代码来声明变量会非常繁琐,所以我们可以使用typedef来定义Block类型
*/
//声明
typedef void(^RLBlock)(NSString *str);
//赋值
RLBlock rlblock = ^(NSString *str){
NSLog(@"%@",str);
};
//调用
rlblock(@"Just Try For It!");
控制台打印结果:
2018-03-05 14:31:04.044298+0800 block[34643:1284532] Do You Like This? YES,I Do!
2018-03-05 14:31:04.044504+0800 block[34643:1284532] 计算结果 : 42
2018-03-05 14:31:04.044889+0800 block[34643:1284532] I am a aVoidBlock
2018-03-05 14:31:04.045363+0800 block[34643:1284532] Just Try For It!
block局部变量访问
/**
堆区 block , 引用局部变量的block
1、在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值
2、在局部变量前使用__block修饰,在声明Block之后、调用Block之前对局部变量进行修改,在调用Block
时局部变量值是修改之后的新值
3、block中不能直接使用修改局部变量 若要修改 需要用 __block对局部变量进行修饰
*/
- (void) mallocBlock {
//局部变量
__block NSString *mallocBlockStr = @"堆区block局部变量";
void (^mallocBlock)(void) = ^(){
mallocBlockStr = @"此时是对的"; //此举正确 如果去掉 __block修饰此处理应报错
NSLog(@"%@", mallocBlockStr);
};
//申明后 、调用前修改局部变量, 实则使用的还是之前的变量值
//如果想使用修改后的变量值,需要用 __block对局部变量进行修饰即可
// mallocBlockStr = @"修改了没?";
NSLog(@"%@", mallocBlock);
mallocBlock();
}
block全局变量访问
/**
全局blcok ,内存全局区
未引用任何局部变量
在声明Block之后、调用Block之前对全局变量进行修改,在调用Block时全局变量值是修改之后的新值
在Block中可以直接修改 全局变量 (静态变量 同全局变量)
*/
NSString *globalStr = @"全局block变量引用";
- (void)globalBlock {
//1、未引用任何外部变量
void (^globalBlockTest) (NSString *) = ^(NSString *global){
NSLog(@"%@",global);
};
NSLog(@"%@",globalBlockTest);
//引用全局变量
void (^globalBlockTest1)(void) = ^(){
NSLog(@"%@",globalStr);
};
NSLog(@"%@",globalBlockTest1);
globalBlockTest1();
}
block作为参数
Block作为C函数参数
#pragma mark - 1.定义一个形参为Block的C函数
void aBlockForC(int(^aBlock)(int, int))
{
NSLog(@"Block For C result = %d", aBlock(300,200));
}
aBlockForC(^(int x, int y) {
return x+y;
});
block作为OC函数参数
-(void)aBlockForOC:(addBlock)aBlock {
NSLog(@"Block For OC result = %d", aBlock(400,200));
}
-(void)aBlockForOC:(int(^)(int, int))aBlock {
NSLog(@"Block For OC result = %d", aBlock(400,200));
}
源码, 只是害怕自己忘记了,留点儿证据,证明block这一块儿,我又来过!