Block的定义:
1> Block是OC中得一种数据类型,在iOS开发中被广泛使用.
2> ^是Block的特有标记.
3> Block的实现代码包含在{ }之间.
4> 大多数情况下,以内联inline函数的方式被定义和使用.
5> Block与C语言的指针有些相似,但使用更加灵活.
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.编译时,类似宏替代,使用函数体替换调用处的函数名;
Block封装了一段代码,可以在任何时候执行;
Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值;
苹果官方建议尽量多使用block.在多线程,异步任务,集合遍历,集合排序,动画转场用得很多.
示例:
int(^sumBlock)(int, int) = ^(int x ,int y){
return x+y ;
};
定义了一个叫sumBlock的blocks对象,它带有两个int参数,返回值类型为int.等式右边{}中的代码块是blocks的具体实现.
格式说明:
返回类型(^Block块名称)(参数类型) = ^(参数列表){代码实现};
如果没有参数, = 后面的参数列表()可以省略.
Block可以访问局部变量,但是不能随便修改.
int sum = 10 ;
int (^MyBlock)(int) = ^(int num){
sum++ ;// 编译器会报错
return num * sum;
};
如果要修改就要加关键字:__block
__block int sum = 10;
注意:
1> 在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝).
2> 后续再对该变量的数值进行修改,不会影响Block中的数值.
3> 如果需要在Block中保持局部变量的数值变化,需要使用__block关键字.
4> 使用__block关键字后,同样可以在Block中修改该变量的数值.
Blocks和函数指针的对比:
// 定义函数指针
int (*myJN)();
//定义Blocks
int (^MyBlocks)(int ,int);
//调用函数指针
(*myJN)(5 ,10);
//调用Blocks
MyBlocks(5 ,10);
Blocks的赋值:
1> 在声明的同时定义变量,然后赋值:
int(^MySum)(int ,int) = ^(int a ,int b){
return a + b;
};
2> 先用typedef声明类型,再定义变量进行赋值:
typedef int(^MySum)(int ,int);
MySum sum = ^(int a ,int b){
return a + b ;
};