ios開發block的使用指南,以及深入理解block的記憶體管理,也適用於osx開發。討論範圍:block的使用,記憶體管理,內部實現。不包含的內容:gc arc下的block記憶體,block在c++中的使用。
block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體、堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。
先看乙個比較簡單的block例子:
int multiplier = 7;
int (^myblock)(int) = ^(int num) ;
在這個例子中,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
; ablock();
}作為引數返回:
typedef void (^boolblock)(bool);
- (boolblock)foo()
; return [[ablock copy] autorelease];//一定要copy,將其複製到堆上,更詳細的原理,將在後續章節講解
}類的乙個成員:
@inte***ce obj1 : nsobject
@property (nonatomic, copy)boolblock block;//理由同上啊,同學們
@end
obj1 *obj1 = ...
obj1.block = ^(bool bvalue) ;
其他函式的引數:
- (void)foo(boolblock block) }
甚至其他block的引數:
boolblock bblock = ^(bool bv)};
hugeblock hblock = ^(boolblock bb) ;
hbolck(bblock);
啊,全域性變數!:
static int(^maxintblock)(int, int) = ^(int a, int b);
int main()
好了,你知道block大概能怎麼用了。
如果要在block內修改block外宣告的棧變數,那麼一定要對該變數加__block標記:
int main()
}; } 好了,基礎很快,更詳細的內容將用來介紹深入的東西。
iOS中Block介紹(一)基礎
block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體 堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。先看乙個比較簡單的block例子 int multiplier 7 int myblock int in...
Block介紹(一)基礎
block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體 堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。先看乙個比較簡單的block例子 int multiplier 7 int myblock int in...
iOS開發 block介紹
void viewdidload nslog 我在看電視 void chargemyiphone void void finishblock void void finishblock 第乙個void表示此block無返回值。為block type的標誌。第二個 void 表示這個block無引數。...