Block 封装了一段代码,可以在任何时候执行
Block可以作为函数或者函数的返回值,而其本身又可以带输入参数货返回值。它和传统的函数指针很类似,但是有区别:Block是inline(内联函数)的,并且默认情况下他对局部变量是只读的。
苹果官网建议尽量多用Block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。
外号 代码段
1.blocks 定义
int (^MySum)(int,int)=^(int a,int b){
return a+b;
}
定义了一个叫MySum的Block对象,它带有两个int参数,返回int,等式右边就是blocks的具体实现。
调用Block
int a=Sum(10,11);
2.typedef来定义
typedef int (^MySum)(int,int);
void test1(){
MySum sum=^(int a,int b){
return a+b;
};
NSLog(@"%i",sum(10,10));
}
block可以访问外面定义的变量
但是默认情况下block中不能修改
如果要修改就加___block关键字。两个下划线,注意。
typedef int (^MySum)(int,int);
void test1(){
MySum sum=^(int a,int b){
return a+b;
};
NSLog(@"%i",sum(10,10));
}
typedef int (^MySum)(int,int);
void test1(){
__block int c=15;
MySum sum=^(int a,int b){
return a+b;
c=19;
};
NSLog(@"%i",sum(10,10));
}
建立Button class,使用block做监听器--------------------->回调
Button.h
@class Button;
typedef void (^ButtonBlock) (Button *btn);
@property (nonatomic,assign) ButtonBlock block;
//mimic button is clicked;
-(void)click{
_block(self);
}
Button.m
main.m
Button *btn=[[[Button]init]autorelease];
//btn.listener=^(Button *btn){
//NSLog(@"button-%@ is clicked",btn);
//};
btn.block=^(Butten *btn){
NSLog(@"Button -%@ is clicked,",btn);
};
[btn click];