关于Block

从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;

两种方式效果相同.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值