沒讀這本書之前,我對(duì) block理解的成長(zhǎng)過程;
block編程對(duì)于許多初識(shí)iOS編程的人來說,很難理解和運(yùn)用,我接觸到的一個(gè)做了java好多年的程序員在剛接觸oc時(shí),block確實(shí)讓他暈了一把;
1. 新手如何面對(duì)block?
首先從宏觀角度理解block,和int作比較,就把block看做一種數(shù)據(jù)類型,只不過它是種高端的數(shù)據(jù)類型;
int main(int argc, const char * argv[]) {
// 沒用的int型數(shù)字100
100;
^{
NSLog(@"我是最簡(jiǎn)單最沒用block,但是可以幫助你理解block");
};
return 0;
}
這樣寫,不會(huì)報(bào)錯(cuò),但是都沒用,100沒有被記錄,同樣block也沒有被記錄;log打印也不會(huì)執(zhí)行;
如果你想用一個(gè)變量記錄一下100這個(gè)數(shù)字,你可能會(huì)這么寫:
int a = 100;
如果你想記錄一些操作即block(這里需要你要把這個(gè)操作看做一個(gè)整體,或者具備某些功能的一條或多條語句),同樣像變量a一樣,不同的是block的類型稍微復(fù)雜一點(diǎn);
// void (^)() 就是block的類型 firstBlock就是變量名
void (^firstBlock)() = ^(){
NSLog(@"我是個(gè)block");
};
//
從block的定義可以作出進(jìn)一步理解,block是一個(gè)特殊的函數(shù),有時(shí)候我們要記錄一些代碼,在必要的時(shí)候執(zhí)行,這個(gè)時(shí)候可以使用block;
函數(shù)是c語言中的稱謂,oc中叫做方法;
既然類似函數(shù),想讓上邊的打印執(zhí)行,就像函數(shù)一樣調(diào)用吧;
firstBlock(); // 打?。何沂莻€(gè)block
// 當(dāng)block沒有參數(shù)的時(shí)候 `=`后邊的block實(shí)現(xiàn)部分的`()`可以不寫
void (^firstBlock)() = ^{
NSLog(@"我是個(gè)block");
};
// 既然是類似函數(shù),void意思是block沒有返回值;下面寫個(gè)有返回值的block
int (^sumBlock)(int a, int b) = ^(int a, int b){ // 有參數(shù)的時(shí)候不能省略括號(hào)了,不然在block內(nèi)部沒法使用參數(shù)了
return a + b;
};
// 這個(gè)block的功能是計(jì)算兩個(gè)整數(shù)的和
int sum = sumBlock(2, 3);
就這樣,block大概不陌生了,也沒什么大不了的,就是包裝了某個(gè)功能的特殊函數(shù);
那么問題來了,為什么不直接使用函數(shù),而要使用block,還搞的這么復(fù)雜;存在即合理,block肯定有它特殊的用處;
如果仔細(xì)guan觀察,會(huì)發(fā)現(xiàn)block都寫在了其他函數(shù)中,就像第一個(gè)最簡(jiǎn)單的firstBlock就寫在main函數(shù)中,沒錯(cuò)block比函數(shù)牛逼的地方是,它可以寫在其他函數(shù)中,不僅如此,你還可以把block當(dāng)做參數(shù)在不同的函數(shù)直接傳遞;
- block寫在其他函數(shù)中,可以和定義它的函數(shù)共享一個(gè)范圍內(nèi)的東西,也就是值捕獲;
- block作為函數(shù)參數(shù)傳遞,穿梭在各個(gè)方法之間,代碼就不會(huì)松散;還有就是可以實(shí)現(xiàn)回調(diào),回調(diào)也可以用代理來實(shí)現(xiàn);
...未完待續(xù)