第二章 Blocks
2.1 Blcock概要
带有自动变量的匿名函数
2.2 Blocks模式
2.2.1 BLock语法
“^” “返回值” “参数列表” “表达式”
返回值和参数列表可省略
与C语言函数名对比
a. 没有函数名
b. 带有 “^”
2.2.2 Blocks类型变量
C语言函数指针
int func(int count) {
return count + 1;
}
int (*funcptr)(int) = &func;
Blocks的声明
int (^blk)(int);
Block可以作为任何参数使用。
int (^blk)(int) = ^(int count){return count +1};
Block类型变量的简单记述
typedef int (^blk_t)(int);
/*
* 原来的记述方式
* void func (int (^blk)(int))
*/
void func (blk_t blk)
/*
* int (^func()(int))
*/
void func(func()(int))
Block的使用
int resulet = blc(10)
2.2.3 自动变量值捕获
int main() {
int dmy = 256;
int val = 10;
const char *fmt = “val = %d\n”;
void (^blk)(void) = ^{printf(fmt, val);};
val = 2;
fmt = “New formmat val = %d\n”;
return 0;
}
该 block 在执行时,字符串指针“val = %d\n”被赋值给自动变量 fmt,int值被复制到自动变量 val 中,因此这些值被保存(即被截获),从而在执行块时使用。
2.2.4 __block 说明符
只能保存执行 block 语法孕检的值,保存后就不能改写该值。给该自动变量附加 __block 说明符,就能实现在 block 内赋值
2.2.5 截获的自动变量
NSMutableArray 可添加修改删除元素,不可重新赋值
C语言数组的截获没有在 block 截获自动变量的方法中实现