前言:block是從iOS4開始引入的一個新特性,block是對C語言的一個擴展,在Objective-C中完全支持。block在現(xiàn)在的iOS開發(fā)中越來越普遍,因為block在使用起來非常強大,簡單來說,block就是封裝了一組代碼語句的對象,可以在任何時間執(zhí)行。
1、Block簡介
Block塊是封裝工作單元的對象,是可以在任何時間執(zhí)行的代碼段。其本質(zhì)上是可移植的匿名函數(shù),可以作為方法和函數(shù)的參數(shù)傳入,可以從方法和函數(shù)中返回?!ǚg自官方文檔)
塊是對C語言的一種擴展,它并未作為標(biāo)準(zhǔn)的ANSI C所定義的部分,而是有蘋果公司添加到語言中的。塊看起來更像是函數(shù),可以給塊傳遞參數(shù),塊也可以具有返回值。
2、Block的定義與調(diào)用
塊是以插入字符^開頭,后面的一個括號()內(nèi)表示塊所需要的參數(shù),最后面的大括號{}中是塊主體,最后以分號;結(jié)束。如下面代碼所示:
^(intinputNum){
NSLog(@"printBlock Called!");
returninputNum;
};
同時,也可以將這個塊賦值給一個變量printBlock,聲明方式如下。其中,變量printBlock就是指向代碼塊的指針。
int(^printBlock)(int)=^(intinputNum){
NSLog(@"printBlock Called!");
returninputNum;
};
當(dāng)需要調(diào)用已經(jīng)定義的block時,可以使用如下方式,和函數(shù)調(diào)用十分類似。
inti=printBlock(100);
3、把Block聲明為類的屬性
由于Block就是一個存儲了一段代碼的對象,因此,也可以把Block設(shè)置為某個類的屬性。同時,可以用self.blockProperty來給該屬性賦值。
@interfaceViewController()
@property(copy)void(^blockProperty)(void);
@property(copy,nonatomic)void(^blockPropertyWithInput)(int);
@end
-(void)viewDidLoad{
[superviewDidLoad];
//blockProperty
self.blockProperty=^{
NSLog(@"blockProperty is called!");
};
self.blockProperty();
//blockPropertyWithInput
self.blockPropertyWithInput=^(inti){
NSLog(@"blockPropertyWithInput is Called! I Value is %d",i);
};
self.blockPropertyWithInput(150);
}