1.Block入門
Block是C語(yǔ)言的擴(kuò)充功能。簡(jiǎn)單的來(lái)說(shuō):Block就是帶有自動(dòng)變量(局部變量)的匿名函數(shù)。這個(gè)可以類比C語(yǔ)言的函數(shù)指針。Block有著靈活和強(qiáng)大的功能,而且不需要命名。Block其實(shí)就是一個(gè)代碼塊,把你想要執(zhí)行的代碼封裝在這個(gè)代碼塊里,等到需要的時(shí)候再去調(diào)用。那block是OC對(duì)象嗎?答案是肯定的。這里把學(xué)習(xí)Block的過(guò)程記錄下來(lái)。
1.1 Block的語(yǔ)法:
^ + 返回值類型 + 參數(shù)列表 + 表達(dá)式
上面就是典型的block語(yǔ)法規(guī)范,舉個(gè)簡(jiǎn)單例子:
^ NSInteger (NSInteger num1, NSInteger num2) {
return num1 + num2;
};// 一個(gè)返回num1 + num2 的簡(jiǎn)單block
當(dāng)然block語(yǔ)法可以省略,當(dāng)返回值或參數(shù)列表為void時(shí)就可以省略,例子如下:
^(int count){count++; };// 等價(jià)于 ^void (int count){ count++; };
^{printf("hello block");}; //等價(jià)于 ^void (void){ printf("hello block"); };
block語(yǔ)法還可以省略返回值類型,這是因?yàn)楸磉_(dá)式中含有return語(yǔ)句時(shí),其返回值類型必須與其一致,基于這種特性,我們可以省略返回值類型,簡(jiǎn)單樣例如下:
^(int count){ return count++; };// 等價(jià)于^int (int count){ return count++; };
1.2 Block作為類型變量:
在C語(yǔ)言中,我們知道聲明一個(gè)函數(shù)指針的語(yǔ)法模式如下:
int func(int count) {
return count++;
}
int (*funcPtr)(int) = &func;
同樣的,block的語(yǔ)法類似:
int (^func)(int) = ^ (int count) {
return count++;
};
既然可以作為變量,那么用法就會(huì)非常靈活,我們可以在函數(shù)返回和使用block變量,可以將block作為函數(shù)參數(shù),實(shí)例如下:
// 定義幾種類型的block
typedef void (^blk_1) (void);
typedef int (^blk_2) (void);
typedef int (^blk_3) (int);
// 1.作為函數(shù)返回;
- (blk_1)func1 {
return ^ {
NSLog(@"block作為返回類型");
};
}
// 2.作為參數(shù)
- (void)func2:(blk_3)blk {
blk = ^ (int count){
return count ++;
};
}
1.3 blcok賦值
block的賦值
格式:block = ^返回值類型(參數(shù)列表){}
沒(méi)有參數(shù)沒(méi)有返回值
myBlock testBlock = ^void(){
NSLog(@"test");
};
// 沒(méi)有返回值,void可以省略
myBlock testBlock1 = ^(){
NSLog(@"test1");
};
// 沒(méi)有參數(shù),小括號(hào)也可以省略
myBlock testBlock2 = ^{
NSLog(@"test2");
};
有參數(shù)沒(méi)有返回值
myBlock1 testBlock = ^void(NSString *str) {
NSLog(str);
}
//省略void
myBlock1 testBlock = ^(NSString *str) {
NSLog(str);
}
有參數(shù)有返回值
myBlock2 testBlock = ^NSString *(NSString *str) {
NSLog(str)
return @"hi";
}
//有返回值時(shí)也可以省略返回值類型
myBlock2 testBlock2 = ^(NSString *str) {
NSLog(str)
return @"hi";
}
1.4 block作用
block是用來(lái)封裝一段代碼,這段代碼可以在任何時(shí)候調(diào)用
與C中指向函數(shù)的指針 類似處
block可以做為方法/函數(shù)的參數(shù)與返回值
block可以接收參數(shù)與返回值
與C中指向函數(shù)的指針 不同處
block是inline的,并且對(duì)局部變量是只讀的;