1墓造、閉包杏愤,帶有局部變量的匿名函數(shù)(即不帶名稱的函數(shù))
2媒区、聲明函數(shù)指針變量
int (*funcptr)(int)=&cfunc驼仪;
3、使用少的代碼量就可以實(shí)現(xiàn)持有局部變量的回調(diào)方法袜漩。
4绪爸、定義:^ 返回值類型 參數(shù)列表 表達(dá)式
^void(int c) {
NSLog(@" 這是一個(gè)Block");
}
與C函數(shù)對(duì)比
1)匿名
2)返回類型前多了一個(gè)^
返回值類型和參數(shù)列表都可以省略 如:
^{
NSLog(@" 這是一個(gè)Block");
}
5、Block類型變量
聲明:int (^blk)(int) ;
調(diào)用:int result = blk(10)宙攻;
與聲明函數(shù)指針(知識(shí)點(diǎn)2)比只是把*改成了^奠货。
可作為,局部變量座掘、函數(shù)參數(shù)递惋、靜態(tài)變量柔滔、靜態(tài)全局變量、全局變量萍虽、函數(shù)返回值類型
在作為函數(shù)參數(shù)或函數(shù)返回值類型時(shí)可以簡(jiǎn)化:
typedef int (^blk_t)(int)
原始聲明:作為參數(shù)
int func(int (^blk) (int))
簡(jiǎn)化后:
int func (blk_t blk)
原始聲明:作為返回值
int (^func() (int))
簡(jiǎn)化后:
blk_t func()?
與C語(yǔ)言其他變量一樣睛廊,可以使用Block類型變量指針
typedef int (^blk_t)(int)
blk_t = ^(int count) {
return count + 1;
}
blk_t *blkptr = &blk;
(*blkptr) (10);
6、截獲自動(dòng)變量值
當(dāng)blocks持有外部變量后杉编,外部變量的更改超全,并不影響blocks內(nèi)部變量的值。
在Blocks內(nèi)部給外部變量賦值會(huì)報(bào)錯(cuò)邓馒,如果外部變量為類嘶朱,調(diào)用外部變量的方法是可以的。
注意在使用c語(yǔ)言數(shù)組指針時(shí)光酣,不能直接調(diào)用其方法疏遏,因?yàn)樵贐locks并沒有對(duì)C語(yǔ)言數(shù)組截獲
7、__block說(shuō)明符
當(dāng)在Blocks表達(dá)式中修改Block 外部聲明的變量時(shí)挂疆,需要在在外部的局部變量前加__block修飾符
8改览、Blocks的實(shí)現(xiàn)
用clang -rewrite-objc? 指令 可實(shí)現(xiàn)對(duì)objc文件的編譯