一、 基本简介
- block用来保存一段代码
block的标志:^
- block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
- 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
- block跟函数很像:
1.可以保存代码 2.有返回值 3.有形参 4.调用方式一样
(和函数又有区别,函数是在编译之前就已经定义好了,是写死了的东西,而block在运行时可以凭空的产生一段运行代码)
二、 Block的特性
block特性
1> 如何定义block变量
int (^mySumBlock)(int, int);
2> 如何利用block封装代码
^(int a, int b) {
return a + b;
};^() {
NSLog(@"----------");
};^ {
NSLog(@"----------");
};
3> block访问外面变量
以代码示例为例:
void test3()
{
int a = 10;
// 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
__block int b = 20;void (^block)();
block = ^{
// block内部可以访问外面的变量
NSLog(@"a = %d", a);// 默认情况下,block内部不能修改外面的局部变量
// a = 20;// 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = 25;
};
block();
}
4> 利用typedef定义block类型
可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b) {
return a - b;
};MyBlock b2 = ^(int a, int b) {
return a - b;
};
与函数对比:
es: 定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
在声明的同时定义变量,然后赋值
int (^MySumBlock)(int, int) = ^(int a, int b) {
return a+b;
};
// ps: 如果block没有形参,可以省略后面的()
pk(对比一下)指向函数的指针:
int sum(int a , int b)
{
return a + b;
}int main()
{
// 指针函数的指针
int (*p)(int, int) = sum;
int d = p(10, 12);
NSLog(@"%d", d);
}
12-Objective-C特有语法:(高效率)block数据类型,布布扣,bubuko.com