OC----Block语法

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;
}//函数
 
 
 
原文地址:https://www.cnblogs.com/hqzxbb/p/4393613.html