下面详细讲解一下带有自动变量值的匿名函数Block的语法,即Block表达式.
<pre>^void (int event) { printf ("buttonId:%d event = %d\n",, event); }
</pre>
与函数相比较,仅有两点不同.
<ol>
<li>没有函数名</li>
<li>带有^:插入记号便于查找</li></ol>
<code>^ 返回值类型 参数列表 表达式</code>
<li>返回值类型:同C语言函数的返回值类型</li>
<li>参数列表:同C语言相通</li>
<li>表达式:同C相同,需含有return,和返回值类型相同</li>
例如可以写出如下的BLcok语法
^int (int count) {return count +1};
Blcok类型变量
在C语言函数中,就可以将定义函数的地址赋值给函数指针类型的变量中.
<pre>int func (int count) { return count +1; } int (* funcptr)(int) = &func;
</pre>
这样一来,函数func的地址就能赋值给函数指针类型变量funcptr中.
同样的,在Block中,可以将Block语言赋值给声明为Block类型的变量中.即源代码中一旦使用Block 语法就相当于生成了可赋值给Block类型变量的"值".Blocks中由Block语法生成的值也被称为"Block".声明Block类型变量仅仅是讲声明函数指针类型的*变为^.该blcok类型变量与一般的C语言变量完全相同.
下面使用Block语法将Block赋值为Blcok类型变量.
int (^blk)(int) = ^(int count) {return count + 1;};
由"^"开始的Block语法生成的Block被赋值给变量blk中.因此与通常的变量相同,所以当然也可以由Block类型变量向Block类型变量赋值.
<pre>int (^blk1 )(int ) = blk; int (^blk2) (int); blk2 = blk1;
</pre>
在函数参数中使用Block类型变量可以向函数传递Blcok.
<pre>void func (int (^blk) (int))
</pre>
在函数返回值中指定Block类型,可以将block作为函数的返回值返回.
<pre>int (^func () (int)) { return ^ (int count ){return count +1;}; }
</pre>
由此可见,在函数参数和返回值中使用BLock类型变量时,记述方式极为复杂.这时,我们可以用typedf解决问题.
typedf int (^blk_t)(int)
网友评论