IOS学习札记24—block

IOS学习笔记24—block

Block是IOS4以后引进的新语法,用来实现匿名函数的特性,有点类似于Java中的匿名内部类但又有一点差别。Apple官方文档对block的解释是:A block is an anonymous inline collection of code, and sometimes also called a "closure".意思就是block是一个匿名的内联代码集合,也被称为“闭包”(closure)。关于闭包可以这么理解:如果一个函数里定义了一个block,那么这个block可以访问这个函数的内部变量。blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似。

block的基本使用

int (^calculateBlock) (int a,int b) = ^(int x,int y){
        return x + y; 
    };
int result = calculateBlock(1,2);
NSLog(@"Result:%d",result);

输出结果:

2012-08-10 12:39:46.064 ASIHttpRequestTest[6083:f803] Result:3


使用这种方式来定义也是一样的,等号左边的参数列表里面可以不指明参数的名称,只要指定参数类型即可:

int (^calculateBlock) (int,int) = ^(int x,int y){
        return x + y; 
    };

等号左边定义了一个名为calculateBlock的block对象,返回值类型为int,有两个int型的参数a和b,左边是block的具体实现,这里返回两个参数的和。使用就像调用普通方法一样传入参数然后得到返回值即可。另外,在block里面只能读取外部变量,而不能对外部变量进行修改,如果要修改外部变量,需要添加__block来修饰外部变量,如下代码:

static int count = 1;
    __blockint sum = 0;
    int (^calculateBlock) (int,int) = ^(int x,int y){
        sum = x + y;
        count = 2;
        return sum; 
    };
    int result = calculateBlock(1,2);
    NSLog(@"Result:%d",result);

输出结果如下:

ASIHttpRequestTest[6187:f803] Result:3count:2


如果要在block中修改外部变量sum的值,必须用关键字__block(前面是两条下划线)来修饰,否则会报错。但是在block中可以直接修改static类型的变量。

block还可以作为函数的参数,当作为函数参数时,可以取代回调函数或者Delegate,当函数调用时触发了某个事件,则block里面的代码会执行,这样的好处是有利于整合代码和代码阅读,而不用去另外编写回调方法或实现委托方法,提高了代码的整体性和可读性,另外使用block可以直接访问函数中的局部变量也是优点之一,这样省去了在回调或委托方法中还需要另外将局部变量进行传递的麻烦,Cocoa中很多类都支持block方式的调用,以下列出了使用block的一些场景:

任务完成时回调

处理消息监听回调处理

错误回调处理

枚举回调

视图动画、变换

排序

以下是一个用block来遍历集合的例子:

//使用block来遍历集合
    __block BOOL found = NO;
    NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj localizedCaseInsensitiveCompare:@"two"] == NSOrderedSame) {
            *stop = YES;
            found = YES;
            NSLog(@"Enumerate is done");
        }
    }];

输出结果如下:

2012-08-10 13:16:26.700 ASIHttpRequestTest[6220:f803] Enumerate is done


以上就简单介绍了以下什么是block以及block的基本使用方法。

欢迎关注我的新浪微博和我交流:@唐韧_Ryan