Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值。Block实体形式如下:
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。或者省略(void)只适用^{行为主体}.
定义代码块类型
定义一个代码块类型如下:
//如果你不加形参a,b也不会报错,我们最好加上,这样可读性更强
typedef void(^Myblock)(int a,int b);
我们定义了一个名为Myblock的代码块类型
使用代码块类型定义属性
@property(nonatomic,readwrite,copy) Myblock block1;
声明方法参数
//代码块类型作为形参,只能传递返回值为void类型的代码块,也就是说 void(^Myblock)(int a,int b)中的void不能是int或其他类型
-(void)finish:(Myblock)block;
声明一个代码块变量
//block是一个代码块变量,=的右边则是代码块对象实体
Myblock block = ^(int a,int b){NSLog(@"a+b = %d",a+b);};
block(100,200);
不定义代码块类型直接使用
定义属性
@property(nonatomic,readwrite,copy) int(^block2)(int,int);
定义了一个名为block2的代码块属性
定义参数
-(void)finish:(void (^)(int a,int b))block;
定义参数只需要给^加上括号就好了,其实void (^)(int a,int b)就是block类型
定义变量
void (^text)() = ^{NSLog(@"aaaa111");};
text();
这里定义了一个text的代码块变量,注意此处的代码块的实体就是省略了^(void)中的(void)