从iOS4开始加入的Block语法现在的应用越来越多,面试中也经常会问到,关于block的知识点和用法在这里简单总结一下
先说block作用,它可以把一段代码封装成为对象,在任何时候进行调用,不仅如此,还可以作为函数的参数甚至返回值,参数还是比较常见的,比如UIView动画的很多方法.返回值的话应用不多,配合某些设计模式会有很不错的效果,比较深了,不再展开讨论.
和函数指针非常类似
int (*)(int); --函数指针
int (^)(int);--block
同时也有区别,其中最重要的一点就是block对于局部变量是只读的.
一个简单的block声明:
int (^add)(int,int); add = ^(int a,int b){return a+b;};
block使用局部变量:
int a=1,b=2; int (^add)(); add = ^(){return a+b;}; int sum = add(); printf("%d\n",sum);
需要注意的就是block对于局部变量只能读取,如果需要更改局部变量的值,那么需要添加__block(双_)标记:
__block int sum = 0; void (^add)(int,int); add = ^(int a,int b){sum = a+b;}; add(1,2); printf("%d\n",sum);
举一个常见的block参数的例子,在NSArray中经常用到的排序方法:
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr这里的NSComparator就是一个block的自定义类型:
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);在对数组进行排序的时候只需要简单的调用这个方法就可以完成排序了:
NSArray *arr = [NSArray array]; [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2]; }];block的作用在这个例子中体现的淋漓尽致,把一段固定代码中的部分内容分割出来,作为一个由用户自定义的内容并判断其执行结果,然后根据执行结果完成后续操作.单纯说可能比较难以理解,分析一下这个函数的底层代码,看下边的例子:
函数声明:
-(void)sort:(BOOL (^)(int, int))block;函数实现:
-(void)sort:(BOOL (^)(int, int))block { int a[5] = {1,3,2,5,4}; for (int i=0; i<4; i++) { for (int j=i+1; j<5; j++) { if (block(a[i],a[j])) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } for (int i=0; i<5; i++) { printf("%d\n",a[i]); } }函数调用:
[self sort:^BOOL(int a, int b) { return a > b; }];一个简单的排序算法,以往在if()中要写的是a>b,这样就是一个固定的升序排序算法,降序的话同样的内容要再写一边,只是把>换成了<,麻烦的要死,
但是通过block把判断条件进行替换,在调用的时候进行指定,那么这一个方法即能用于升序也能用于降序,非常方便,非常强大.
block的其他功能还有很多,这里不在赘述了,大家可以自己进行尝试,相信你会越来越喜欢这东西.
PS:
上边的函数声明可能不是特别容易理解,咱们换一种方式:
首先声明一种block类型
typedef BOOL (^sortBlock) (int,int);
用这种类型声明一个参数:
-(void)sort:(sortBlock)block;
两种方式效果相同.