1.block是一个数据类型
- 存储一段代码
- 但不是任意的代码都可以存储
- 声明block类型变量的时候,必须要指定这个block变量中可以存储的代码的参数和返回值,一旦指定,这个block类型只能存储这样的代码段,别的格式的代码段是无法存储
- block类型的声明
- void(^myBlock)();
- 代表声明了一个block类型的变量,变量名叫做myBlock
- 这个变量中只能存储没有返回值也没有参数的一段代码
- int(^myBlock1)(int num1,int num2);
- 代表声明一个block类型的变量,变量名叫做myBlock1
- 这个变量中只能存储int返回值类型,参数为两个int类型的代码
- block变量的赋值
NSLog(@"Hasakei!");
};
- 代表创建了一段block类型的代码,代码中存储是 NSLog(@"Hasakei!”);这段代码
- 也可以写在一起
- block简写方式
- 若block的代码段没有参数
- 那么代码段前的参数小括号可以省略
- ^void
{
NSLog(@"laugh out loud");
}; - void后的()可以省略
- 如果代码段没有返回值,那么代码段前的返回值类型void也可以省略
- ^{
NSLog(@"laugh out loud");
}; - 即^后的返回值类型和参数的小括号都可以省略
- 在声明block变量时,如果要求存储的代码有参数,这时参数的名字可以省略,只写类型
- typedef将一个长的block类型定义为一个短类型
- 语法
- typedef 返回值类型 (^新类型名称)(参数列表)
- e.g. typedef int (^nice)(int a,int b,int c); == int(^nice)(int a,int b,int c);
- 直接使用^nice就可以定义新block代码段了
2.在block代码块的内部可以取出外部的全局变量和局部变量的值
- 在block代码块的内部可以定义一个和外部变量名称相同的变量,就近原则
- 在block代码块的内部,可以访问全局变量和局部变量,可以修改全局变量的值,但是不能修改局部变量的值
- 若非要修改局部变量的值,那么在局部变量前需要使用__block修饰
3.block的用途
- block作为函数的参数
- 只需要在函数的小括号当中写上一个block类型的参数即可
- void saiHi(void (^myBlock)());
- 如何调用带有block参数的函数
- 可以先将要传递的block代码段存储到一个block变量中去
- 然后通过函数调用时参数加入相应的变量即可
- 也可以在函数调用时直接填写上block类型的代码段
|
|