iOS中Block介紹(一)基礎(chǔ)
一、概述
Block是C級(jí)別的語(yǔ)法和運(yùn)行時(shí)特性。Block比較類似C函數(shù),但是Block比之C函數(shù),其靈活性體現(xiàn)在棧內(nèi)存、堆內(nèi)存的引用,我們甚至可以將一個(gè)Block作為參數(shù)傳給其他的函數(shù)或者Block。
二、熱身
先看一個(gè)比較簡(jiǎn)單的Block例子:
- int multiplier = 7;
- int (^myBlock)(int) = ^(int num) {
- return num * multiplier;
- };
在這個(gè)例子中,myBlock是一個(gè)Block變量,它接受一個(gè)int類型的參數(shù),返回一個(gè)int類型的值。是不是很像C函數(shù)?
來(lái),讓我們typedef一下
- typedef void (^BoolBlock)(BOOL);//一個(gè)只接受一個(gè)BOOL參數(shù),沒(méi)有返回值的block
- typedef int (^IntBlock)(void);//一個(gè)沒(méi)有參數(shù),返回int的block
- typedef BoolBlock (^HugeBlock)(IntBlock);//看看,這個(gè)HugeBlock的參數(shù)和返回值都是block
三、更詳細(xì)的例子
注意:上面的typedef都還有效~
主動(dòng)調(diào)用一下:
- - (void)someMethod
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- ablock();
- }
作為參數(shù)返回:
- typedef void (^BoolBlock)(BOOL);
- - (BoolBlock)foo()
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- return [[ablock copy] autorelease];//一定要copy,將其復(fù)制到堆上,更詳細(xì)的原理,將在后續(xù)章節(jié)講解
- }
類的一個(gè)成員:
- @interface OBJ1 : NSObject
- @property (nonatomic, copy)BoolBlock block;//理由同上啊,同學(xué)們
- @end
- OBJ1 *obj1 = ...
- obj1.block = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
其他函數(shù)的參數(shù):
- - (void)foo(BoolBlock block)
- {
- if (block) {
- block();
- }
- }
甚至其他block的參數(shù):
- BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
- HugeBlock hBlock = ^(BoolBlock bB) {bB();};
- hBolck(bBlock);
啊,全局變量!:
- static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
- int main()
- {
- printf("%d\n", maxIntBlock(2,10));
- return 0;
- }
好了,你知道block大概能怎么用了。
四,特殊的標(biāo)記,__block
如果要在block內(nèi)修改block外聲明的棧變量,那么一定要對(duì)該變量加__block標(biāo)記:
- int main()
- {
- __block int i = 1024;
- BoolBlock bBlock = ^(BOOL bV) {
- if (bV) {
- i++;//如果沒(méi)有__block標(biāo)記,是無(wú)法通過(guò)編譯的。
- }
- };
- }
好了,基礎(chǔ)很快,更詳細(xì)的內(nèi)容將用來(lái)介紹深入的東西。