Objective-C 代码块

版权说明:本文为原创文章,未经允许,不得转载。

代码块(Block)

1.代码块是对C语言中函数的扩展,除了函数中的代码,代码块还包含变量绑定。代码块有时候也被称之为闭包。

由于函数调用是异步执行的,如果想让一个操作执行完之后,执行另一个函数,则无法按照正常代码书写顺序进行编程,这时就需要代码块。

代码块是一个函数体(匿名函数),它是 Objective-C 对于闭包的实现,在代码块中,可以持有或引用局部变量,同时利用 Block 可以将一个操作作为一个参数进行传递。

代码块本质上和其他变量类似,不同的是,代码块存储的数据是一个函数体,可以像调用其他标准函数一样,传入参数值,并得到返回值。

2.Block 的定义

脱字符 (^) 是代码块的语法标记。

Block 定义:返回值类型(^ 变量名)(参数列表)

int (^myBlock)(int)

typedef定义:返回值类型(^类型名称)(参数列表);

typedef int(^myBlock)(int,int);

Block的实现:^(参数列表){操作主体};

^(NSString * str1){ NSLog(@"%@",str1); };

借用一张图来表示:

代码块

3.代码块的使用

3.1 参数是 NSString * 的代码块

void (^printBlock)(NSString *) = ^(NSString * str1){
    NSLog(@"%@",str1);
};

printBlock(@"Hello World!");

以上代码输出结果为 Hello World!

3.2 利用代码块进行数组排序

NSArray *strArray = [NSArray arrayWithObjects:@"s1", @"s6", @"s3", @"s10", @"s22", @"s17", @"s31", nil];

NSArray *sortArray = [strArray sortedArrayUsingComparator:^NSComparisonResult(id string1, id string2){
        return [string1 compare:string2 options:NSNumericSearch];
}];

NSLog(@"sortArray:%@",sortArray);

以上代码输出结果为:

sortArray:(s1, s3, s6, s10, s17, s22, s31)

3.3 代码块可以使用和修改全局变量,而局部变量可以使用却无法修改,如需修改,需要在局部变量前加上 _block 关键字进行修饰。