block是用来保存一段代码(程序运行时产生的代码)
跟函数的区别:函数是在程序运行之前就已经写好的,而block(代码块)是在程序运行中生成保存的代码块
Block:
1》block用来保存一段代码,我们可以称block为代码块
2》block的标记是一个上尖符号(^)
3》block跟函数也有类似之处:1⃣️可以保存代码
2⃣️有返回值
3⃣️有形参
《1》无形参无返回值block:
void(^myBlock)() = ^{//【void】没有返回值 【(^myBlock)】block的名字 【()】没有形参 【^{}】block主体
NSLog(@"我是被block(代码块)保存的代码!");
};
myBlock();//block的调用
输出:
2015-09-29 00:38:56.413 OCStudy[8835:7938557] 我是被block(代码块)保存的代码!
【void】没有返回值 【(^myBlock)】block的名字 【()】没有形参 【^{}】block主体
《2》有形参有返回值block:
int(^myBlockWitParam)(int,int) = ^(int a,int b){
return a + b;
};
NSLog(@"myBlockWitParam(10,20):%d",myBlockWitParam(10,20));
输出:
2015-09-29 01:00:21.460 OCStudy[8859:8024734] myBlockWitParam(10,20):30
【int】返回值类型 【(^myBlockWitParam)】block的名字 【(int,int)】形参 【^(int a,int b){}】block主体
《3》指向函数的指针:
//函数
int sum(int a,int b) {
return a + b;
}
//定义指向函数的指针p
int (*p)(int,int) = sum;
NSLog(@"p(10,40)=%d",p(10,40));
输出:
2015-09-29 01:17:46.904 OCStudy[8875:8112882] p(10,40)=50
《4》block内部可以访问外部的变量,想要在block内部改变外边的变量需要在变量前加上__block关键字修饰
//block访问外部变量
int a = 100;
void(^blockValue)() = ^{
NSLog(@"blockValue inside access a=%d",a);
};
blockValue();
输出:
2015-09-29 01:33:29.871 OCStudy[8912:8184727] blockValue inside access a=100
//普通外部变量在block内部无法被修改,通过加上__block之后,我们可以在block内部对外部变量进行修改
__block int a = 100;
void(^blockValue)() = ^{
a = 250;
};
blockValue();
NSLog(@"blockValue reset a=%d",a);
输出:
2015-09-29 01:37:27.813 OCStudy[8920:8200029] blockValue reset a=250
《5》利用typedef来定义block
typedef int (^Multi)(int,int);
Multi multiAAndB = ^(int a,int b){
return a * b;
};
NSLog(@"multiAAndB(10,20)=%d", multiAAndB(10,20));
输出:
2015-09-29 01:44:49.439 OCStudy[8932:8233543] multiAAndB(10,20)=200
有了Multi,我们就可以利用Multi类型来定义变量