1.block封装了一段代码,可以在任何时候执行。
2.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,它和传统的函数指针很类似,但是有区别,block是inline(内联函数)的,并且默认情况下它对局部变量是只读的
3.block很好用并且性能很高,苹果官方建议尽量多的使用block,在多线程,异步任务,集合遍历,集合排序,动画转场用的很多。
4.block: int(^sum) (int ,int); 1。返回值类型 2。block名字 3.参数:
//定义了一block,这个block返回值是int类型,接收两个int类型的参数。
int (^sum)(int,int) = ^(int a,int b){
return a+b;
};
int demo = sum(20,49);
NSLog(@"%d",demo);
也可以用typedef将block定义为一种数据类型:这样就比较灵活了
typedefint (^Sum) (int ,int );
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
};
int count = sum(2,3);
NSLog(@"%d",count);
5.注意:block可以访问外面定义的局部变量。但是不能修改
如果你想要在block修改外面定义的局部变量,那么就对变量进行声明__block (两个下划线);
__blockint num =10;
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
num=11;
};
int count = sum(2,3);
NSLog(@"%d",count);
6.block作为监听器使用:(模拟按钮被点击事件);
1.定义一个button类:
2.定义一个block;
3.block的具体实现
4.调用block,
.h文件代码为:
#import<Foundation/Foundation.h>
@classButton;
//定义block;
typedefvoid(^ButtonBlock)(Button *);
@interface Button :NSObject
//为block声明setter和getter方法:
@property (nonatomic,copy)ButtonBlock block;
-(void)onclick;
@end
block的具体实现代码:
btn.block=^(Button*btn)
{
NSLog(@"%@点击了我 ",btn);
};
.m文件:
#import"Button.h"
@implementation Button
-(void)onclick{
_block(self);
}
@end
在main函数中:
Button *btn = [[[Buttonalloc]init]autorelease];
btn.block=^(Button *btn)
{
NSLog(@"%@点击了我 ",btn);
};
//模拟按钮被点击了
[btnonclick];
注意:这个代码,先在main函数中实现了block的具体实现,然后再用button类中进行调用,这是属于回调机制。