Block
- Block封装了一段代码,可以在任何时候执行
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下它对局部变量是只读的
- 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历。集合排序。动画转场用的很多
Block的定义:
int (^Mysum) (int,int) = ^ (int a,int b){
return a+b;
};
定义了一个叫Mysum的block对象,它带有两个int参数,返回int。等式右边就是block的具体实现
Block可以访问局部变量,但是不能修改。
int sum =10;
int (^MyBlock) (int) = ^(int num){
sum++;//编译报错
return num*sum;
};
如果要修改就要加关键字:__block(block前是两个下滑线) 例如: ( __block int sum=10;)
另外我们也可以用typedef定义block,例如:
typedef int (^Mysum)(int a,int b) void test(){ //声明一个block变量 Mysun sum=^(int a,int b){ return a+b; } NSLog(@“%i”,sum(10+10)) }
Block可以访问局部变量,默认情况下是只读,不能修改,例如:
void test2(){ //在block外定义一个变量c int c=1; Mysum sum=^(int a,int b){ //在block内部打印一下外部的c NSLog(@“%i”,c); return a+b; } NSLog(@“%i”,sum(10,10); }
如果想要修改,需要加__block关键字,block前是两个下划线
利用block做监听器,例子:
//main.m文件 void test(){ Butoon *btn=[[Button alloc] init]; btn.block=^(Button *btn){ NSLog(@“按钮被点击了”); } [btn click]; }
Button.h文件
@class Button; //定义一个block,传递Button类型的参数 typedef void (^Buttonblock)(Button *btn); @property (nonatomic, assign)Buttonblock block; -(void)click;
Button.m文件
-(void)click{ _block(self); }
指向函数的指针跟block的区别:
int (^sum) (int,int)=^(int a,int b){ return a+b; };//block
int (*sum)(int,int)=sum; int sum(int a,int b){ return a+b; }//函数