------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. Block介绍
Block是一种数据类型,存储一段代码段/块
^操作符声明一个block变量
int (^MyBlock)(int , int)=^(int x, int y){代码块};
int:代码块返回值类型
^MyBlock:定义一个Block类型变量,变量名是MyBlock
(int , int):参数类型及个数说明
^:表示一个代码块
(int x, int y):形参列表
Block定义(对比函数学习):
void(^block1) ( )=^( ){ 代码块}; //定义一个无参无返回值的block变量
int (^block2)( )=^( ){ 代码块}; //定义一个无参有返回值的block变量
void (^block3)(int , int)=^(int x, int y){代码块}; //定义一个有参无返回值的block变量
int (^block4)(int , int)=^(int x, int y){代码块}; //定义一个有参有返回值的block变量
Block使用格式:Block变量名( 实参);
Block使用代码示例:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//定义一个有参有返回值的Block变量
int(^MyBlock)(int,int)=^(int x,int y){
return x+y;
};
//使用Block
int result= MyBlock(13,4);
NSLog(@"result=%d",result);
return 0;
}
}
2. Block的typedef
对比函数指针
函数指针定义形式:类型说明符 (*指针变量名)();
eg: int (*p)(int x, int y);
Block的typedef的格式:typedef int (^新别名)(参数类型列表);
eg :typedef int (*NewType)(int x, int y); //此处NewType不是一个变量,而是一个类型,可以定义该类型的变量
NewType block1=^(int a, int b){
return a+b;
}
Block访问外部变量
在Block内部访问外部变量的值时,Block把外部变量的值以const方式copy一份存放到Block所在的内存中,copy的值不能修改
在Block内部可以定义和外部变量同名的变量,该变量可以在Block内部使用,在Block代码块结束时释放
如果要在Block代码块内部访问外部变量,需要在外部变量前加上__block
示例代码如下:
int main(int argc, const char * argv[]) {
@autoreleasepool {
int m=10;
NSLog(@"m address1=%p",&m);//打印出m的地址
void(^MyBlock1)()=^{
// m=100; 在Block内部修改外部变量的值会报错
NSLog(@"m address2=%p",&m); //在Block内部打印出m的地址和外部不同
};
MyBlock1();
__block int n=1;
//打印出m的值
NSLog(@"n=%d",n); // 1
void(^MyBlock2)()=^{
n=100;
//打印m值,看是否被修改
NSLog(@"n=%d",n); // 100
};
MyBlock2();
//打印m值,看是被修改后的值在Block外是否也有效
NSLog(@"n=%d",n); // 100
return 0;
}
}
Block可以作为方法返回值,也可以作为方法的参数。
Block助记符——inlineBlock