iOS中Block介紹(一)基礎,iosblock介紹基礎
一、概述
Block是C層級的文法和運行時特性。Block比較類似C函數,但是Block比之C函數,其靈活性體現在棧記憶體、堆記憶體的引用,我們甚至可以將一個Block作為參數傳給其他的函數或者Block。
二、熱身
先看一個比較簡單的Block例子:
- int multiplier = 7;
- int (^myBlock)(int) = ^(int num) {
- return num * multiplier;
- };
在這個例子中,myBlock是一個Block變數,它接受一個int類型的參數,返回一個int類型的值。是不是很像C函數?
來,讓我們typedef一下
- typedef void (^BoolBlock)(BOOL);//一個只接受一個BOOL參數,沒有傳回值的block
- typedef int (^IntBlock)(void);//一個沒有參數,返回int的block
- typedef BoolBlock (^HugeBlock)(IntBlock);//看看,這個HugeBlock的參數和傳回值都是block
三、更詳細的例子
注意:上面的typedef都還有效~
主動調用一下:
- - (void)someMethod
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- ablock();
- }
作為參數返回:
- typedef void (^BoolBlock)(BOOL);
- - (BoolBlock)foo()
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- return [[ablock copy] autorelease];//一定要copy,將其複製到堆上,更詳細的原理,將在後續章節講解
- }
類的一個成員:
- @interface OBJ1 : NSObject
- @property (nonatomic, copy)BoolBlock block;//理由同上啊,同學們
- @end
-
- OBJ1 *obj1 = ...
- obj1.block = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
其他函數的參數:
- - (void)foo(BoolBlock block)
- {
- if (block) {
- block();
- }
- }
甚至其他block的參數:
- 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大概能怎麼用了。
四,特殊的標記,__block
如果要在block內修改block外聲明的棧變數,那麼一定要對該變數加__block標記:
- int main()
- {
- __block int i = 1024;
- BoolBlock bBlock = ^(BOOL bV) {
- if (bV) {
- i++;//如果沒有__block標記,是無法通過編譯的。
- }
- };
- }
每天都有不一樣的太陽