2017/4/11
Block:带有自动变量(局部变量)的匿名函数
声明一个匿名函数int func(int count);调用id result = func(10);
虽然可以用指针代替id result = (*funcp)(10);
在int (*funcp)(int) = &func;还是需要知道函数名来获取地址
表达形式^void (int event) {} ^(插入记号,creat)
返回值,参数列表,表达式
声明block变量int (^block)(int);
给block变量赋值int (^blk)(int) = ^void (int count) {操作};
block语法生成的block赋值给变量blk
在函数参数中使用block类型的变量void func (int (^blk)(int)) {}
函数返回值使用block变量int ( ^ func() (int)) {return void ^ (int count) {}}
为了看着不混淆用typedoftypedofint (^blk) (int a)
声明一个返回值int类型参数int类型的blk类型的变量
blk类型变量作为参数void func (blk b)zai
blk类型变量作为返回值blkfunc() {}
在C语言中使用int func(blk b, int a) {return b(a) }
在OC中使用– (void)methordUseBlock: (blk)b a: (int)a {
return b(a) }
intmain() {
inta =10;
void(^myBlock)(void) =void^(){ printf(a) };
a =20;
myBlock();
}
保存的是变量的瞬间值,block外部也无法改变内部的值
如果想在内部使用(修改)该变量,声明的时候需要加上__block
intmain() {
__blockinta =10;
void(^myBlock)(void) =void^(){ a = 1; printf(a);};
myBlock();
}
在OC中,
id array = [[NSMutableArrayalloc]init];
void (^blk)(void) = void^{
id obj = [[NSObjectalloc]init];
[array addObject:obj];
};
这种是可以的,因为截获的是实例对象的指针,所以,使用对象不会有问题
id array = [[NSMutableArrayalloc]init];
void (^blk)(void) = void^{
array = [[NSMutableArrayalloc]init];
};
这种是需要加__block;