iOS中Block介紹(一)基礎(chǔ)
一、概述
Block是C級別的語法和運行時特性。Block比較類似C函數(shù),但是Block比之C函數(shù),其靈活性體現(xiàn)在棧內(nèi)存、堆內(nèi)存的引用,我們甚至可以將一個Block作為參數(shù)傳給其他的函數(shù)或者Block。
二、熱身
先看一個比較簡單的Block例子:
- int multiplier = 7;
- int (^myBlock)(int) = ^(int num) {
- return num * multiplier;
- };
在這個例子中,myBlock是一個Block變量,它接受一個int類型的參數(shù),返回一個int類型的值。是不是很像C函數(shù)?
來,讓我們typedef一下
- typedef void (^BoolBlock)(BOOL);//一個只接受一個BOOL參數(shù),沒有返回值的block
- typedef int (^IntBlock)(void);//一個沒有參數(shù),返回int的block
- typedef BoolBlock (^HugeBlock)(IntBlock);//看看,這個HugeBlock的參數(shù)和返回值都是block
三、更詳細(xì)的例子
注意:上面的typedef都還有效~
主動調(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é)講解
- }
類的一個成員:
- @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);
啊,全局變量?。?/strong>
- 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外聲明的棧變量,那么一定要對該變量加__block標(biāo)記:
- int main()
- {
- __block int i = 1024;
- BoolBlock bBlock = ^(BOOL bV) {
- if (bV) {
- i++;//如果沒有__block標(biāo)記,是無法通過編譯的。
- }
- };
- }
好了,基礎(chǔ)很快,更詳細(xì)的內(nèi)容將用來介紹深入的東西。