2017/4/11
Block:帶有自動變量(局部變量)的匿名函數(shù)
聲明一個匿名函數(shù)int func(int count);調(diào)用id result = func(10);
雖然可以用指針代替id result = (*funcp)(10);
在int (*funcp)(int) = &func;還是需要知道函數(shù)名來獲取地址
表達(dá)形式^void (int event) {} ^(插入記號,creat)
返回值,參數(shù)列表,表達(dá)式
聲明block變量int (^block)(int);
給block變量賦值int (^blk)(int) = ^void (int count) {操作};
block語法生成的block賦值給變量blk
在函數(shù)參數(shù)中使用block類型的變量void func (int (^blk)(int)) {}
函數(shù)返回值使用block變量int ( ^ func() (int)) {return void ^ (int count) {}}
為了看著不混淆用typedoftypedofint (^blk) (int a)
聲明一個返回值int類型參數(shù)int類型的blk類型的變量
blk類型變量作為參數(shù)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外部也無法改變內(nèi)部的值
如果想在內(nèi)部使用(修改)該變量,聲明的時候需要加上__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];
};
這種是可以的,因?yàn)榻孬@的是實(shí)例對象的指針,所以,使用對象不會有問題
id array = [[NSMutableArrayalloc]init];
void (^blk)(void) = void^{
array = [[NSMutableArrayalloc]init];
};
這種是需要加__block;