iOS开发之oc(十三)--Block的使用
(一)Block
是一种数据类型(就需要定义一种变量保存这种类型)
作用:用Block封装(保存)一段代码,可以在任何时候执行
block跟函数很像:
1.可以保存代码
2.有返回值
3.有形参
4.调用方式一样
Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
在多线程、异步任务、集合遍历、集合排序、动画转场用的很多,因此,苹果官方建议尽量多用block。
(二)Block定义
int (^MySum)(int, int) = ^(int a, int b) { return a+b; };
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
int sum = 10; int (^MyBlock)(int) = ^(int num) { sum++; // 编译报错 return num * sum; }; // 如果要修改就要加关键字:__block __block int sum = 10;
(三)Block和函数指针对比
>定义函数指针
int (*myFn)();
>定义Blocks
int (^MyBlocks)(int,int);
>调用函数指针
(*myFn)(10, 20);
>调用Blocks
MyBlocks(10, 20);
(四)Blocks的赋值
>在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
>也可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
>block访问外面的变量
代码示例
int a = 10; __block int b = 20; void (^block)(); block = ^{ // block内部可以访问外面的变量 //NSLog(@"a = %d", a); // 默认情况下,block内部不能修改外面的局部变量 // a = 20; // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 b = 25; }; block(); }
block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> 如何利用block封装代码 ^(int a, int b) { return a - b; };