Block的使用

Block:

1.

//代码块的声明
void (^aBlock) (NSString *str);    
// 代码块变量的赋值
aBlock = ^(NSString *str){
NSLog(@"%@", str);
};
// 提示:在声明代码块的时候,是可以传递多个参数的,中间使用‘,’分隔开就醒了,也可以不写出参数的名称,只写类型就可以,但是不建议这么做,因为别人看你的代码的时候可能会不理解,建议写全。要记住,最后面也是以分号结尾的。
// 代码块声明的时候返回值不可以省略,但是参数名可以省略
// 代码块变量赋值的时候返回值可以省略,但是参数吗不可以省略

2.

代码块的声明比普通变量的声明复杂,普通变量不需要传入参数,并且没有返回值。因为代码块存储的数据是一个函数体,所以声明代码块变量时需要声明参数和返回类型。

3.

‘^’叫做脱字符

4.

// 调用代码块,直接使用名称调用即可,然后传递需要的参数,有返回值的接受下,反之不需要接收
void (^MyBlock) (NSString *str) = ^(NSString *str) {
        NSLog(@"%@", str);
    };
    MyBlock(@"abcdefjlfsd");

5.把代码块像对象一样传递

// 定义一个参数是代码块的方法
void useCodeBlock(int (^mmyBlock) (int x, int y)) {
int result = mmyBlock(300, 200);
NSLog(@"result = %d", result);
}

// 以代码块作为函数参数
    int (^addBlock) (int x, int y) = ^(int x, int y) {
        return x + y;
    };
    useCodeBlock(addBlock);
    int (^subBlock) (int x, int y) = ^(int x, int y) {
        return  x - y;
    };
    useCodeBlock(subBlock);

    // 以内联定义的代码块作为函数参数
    useCodeBlock(^int (int x, int y) {
        return x + y;
    });
    useCodeBlock(^int (int x, int y) {
        return x - y;
    });
// 通常来说,block都是一些简短代码片段的封装,适合做工作单元,通常用来坐并发任务、遍历、以及回调。用block作为回调函数,可以使得程序员写代码更顺畅,不用中途跑到另一个地方写一个回调函数。采用block,可以在调用函数时直接写后续代码处理,将其作为参数传递过去,供其任务执行结束时回调。

6.在代码块中使用全局变量和局部变量

6.1.在代码块中可以使用全局变量,也可以更改

6.2.在代码块中可以使用局部变量,但是不可以更改,如果要更改局部变量,需要加上‘__block’关键字,注意是两个下划线。

7.使用代码块进行NSArray和NSMutableArray的排序

#if NS_BLOCK_AVAILABLE
typedef NSComparisonResult (^NSComparator) (id obj1, id obj2);
#endid

这个写的还很少,以后再补。。。