1.1什么是Block?
Block是C语言的扩充功能。可以用一句话来表示Block的扩充功能:带有自动变量(局部变量)的匿名函数。
顾名思义,所谓匿名函数就是不带有名称的函数,C语言的标准不允许存在这样的函数。如以下源代码:
int func(int count);
它声明了名称为func的函数。下面的源代码中为了调用该函数,必须使用该函数的名称func.
int result = func(10);
如果像下面这样,使用函数指针来代替直接调用函数,那么似乎不用知道函数名称也能够使用函数。
int result = (*funcptr(10));
但其实使用函数的指针也仍然需要知道函数名称,像以下与源代码这样,在赋值给函数指针时,若不使用想赋值的函数的名称,就无法取得该函数的地址。
int (*funcptr)(int)=&func;
int result = (*funcptr)(10);
而通过block,源代码中就能够使用匿名函数,即不带名称的函数。对于程序员而言,命名就是工作的本质。函数名、变量名、方法名、属性名、类名、和框架名称等都必须具备。而能够编写不带名称的函数对程序员来说相当具有吸引力。
2,block模式
2.1block语法
^(int event){
NSLog(@"1111111111111");
};
实际上该block语法使用了省略方式,其完整形式如下:
^void (int event){
NSLog(@"1111111111111");
};
如上所示,完整形式的block语法与一般的C语言函数定义相比,仅有两点不同。
(1)没有函数名。
(2)带有“^"。
第一点不同是没有函数名,因为它是匿名函数。第二点不同是返回值类型前带有”^"(插入记号,caret),因为)OS X,iOS应用程序的源代码中将大量使用block,所以插入该记号便于查找。
以下为block的语法:
^ 返回值类型 参数列表 表达式
表达式中有return语句时,其类型必须与返回值类型相同。
例如可以写出如下形式的block语法:
^int ( int count ){ return count+1; }
虽然前面出现过省略方式,但block语法可以省略好几个项目,首先是返回值类型。
^ 参数列表 表达式
省略返回值类型时,如果表达式中有return语句时就使用该返回值类型,如果表达式中没有return语句就使用void类型。表达式中年含有多个return语句时,所有return的返回值类型必须相同,前面的源代码省略其返回值类型时的表达式如下所示:
^(int count){ return count+1;};
该block语句将按照return语句的类型,返回int型返回值。
其次,如果不使用参数,参数列表也可省略。以下为不使用参数的block语法:
^void (void){NSLog(@"11111");}
该代码可省略为如下形式:
^{NSLog(@"111111");}
返回值类型、参数列表均被省略的block语法:
^ 表达式
网友评论