概述:
-代码块对象简称为"代码块".是对c语言函数的扩展.运行在iOS4.0和OS X10.6版本以上
-代码块实际上是c语言实现的,所以在各种以c作为基础的语言内都是有效的包括:object-c,c++,以及object-c++
-代码块本质是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码时,可以像调用其他函数一样,传入参数,并得到返回值.
函数指针 vs 代码块
函数指针的语法格式
返回值类型 (*函数名)(参数列表);
eg:void (*myFunction)(void);
代码块的语法格式
返回值 (^代码块名)(参数列表) = ^返回值类型 (参数列表) {表达式;};
eg: void (^myBlock)() = ^{printf("Hello,Block\n");}
说明:
返回值类型和参数列表都可以有条件的省略
省略返回值类型时,若表达式中有return语句就使用该返回值的类型,若没有,则为void
省略返回值类型时,若表达式中有多个return语句,则所有的语句返回值的类型必须相同
如果不使用参数,则参数列表也可以省略
dda 打a'd
代码块的使用
a.直接使用
void (^myBlaock)() = ^{printf("HEllo,world!\n");};
myBlock();
b.代码块的内联
NSArray *array = @[@"One", @"Two", @"Three", @"Four"];
NSLog(@"Sorted array: %@", sortedArray);
NSLog(@"Unsorted array: %@", array);
NSArray *sortedArray = [array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
NSLog(@"Sorted array :%@",sortedArray);
使用typedef定义相同类型的代码块
typedef void (^ChangelableText)(NSString *);
声明 ChangeLableText blk;
代码块的变量
-全局变量和静态变量在代码块内部可以正常使用(改其值)
-局部变量在代码块内部无法修改其值,原因是代码块的局部变量在编译阶段被看作位常量
-如果需要在代码块中修改局部变量,需要在局部变量前面加__block修饰符
NSLog(@"Sorted array: %@", sortedArray);
NSLog(@"Unsorted array: %@", array);
NSArray *sortedArray = [array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
NSLog(@"Sorted array :%@",sortedArray);
使用typedef定义相同类型的代码块
typedef void (^ChangelableText)(NSString *);
声明 ChangeLableText blk;
代码块的变量
-全局变量和静态变量在代码块内部可以正常使用(改其值)
-局部变量在代码块内部无法修改其值,原因是代码块的局部变量在编译阶段被看作位常量
-如果需要在代码块中修改局部变量,需要在局部变量前面加__block修饰符