沒讀這本書之前蹋盆,我對 block
理解的成長過程漆魔;
block編程對于許多初識iOS編程的人來說,很難理解和運用农猬,我接觸到的一個做了java好多年的程序員在剛接觸oc時赡艰,block確實讓他暈了一把;
1. 新手如何面對block?
首先從宏觀角度理解block斤葱,和int
作比較慷垮,就把block看做一種數(shù)據(jù)類型,只不過它是種高端的數(shù)據(jù)類型揍堕;
int main(int argc, const char * argv[]) {
// 沒用的int型數(shù)字100
100;
^{
NSLog(@"我是最簡單最沒用block料身,但是可以幫助你理解block");
};
return 0;
}
這樣寫,不會報錯衩茸,但是都沒用芹血,100沒有被記錄,同樣block也沒有被記錄楞慈;log打印也不會執(zhí)行幔烛;
如果你想用一個變量記錄一下100這個數(shù)字,你可能會這么寫:
int a = 100;
如果你想記錄一些操作
即block(這里需要你要把這個操作看做一個整體囊蓝,或者具備某些功能的一條或多條語句)饿悬,同樣像變量a一樣,不同的是block的類型稍微復(fù)雜一點聚霜;
// void (^)() 就是block的類型 firstBlock就是變量名
void (^firstBlock)() = ^(){
NSLog(@"我是個block");
};
//
從block的定義可以作出進(jìn)一步理解狡恬,block是一個特殊的函數(shù)珠叔,有時候我們要記錄一些代碼,在必要的時候執(zhí)行傲宜,這個時候可以使用block运杭;
函數(shù)是c語言中的稱謂夫啊,oc中叫做方法函卒;
既然類似函數(shù),想讓上邊的打印執(zhí)行撇眯,就像函數(shù)一樣調(diào)用吧报嵌;
firstBlock(); // 打印:我是個block
// 當(dāng)block沒有參數(shù)的時候 `=`后邊的block實現(xiàn)部分的`()`可以不寫
void (^firstBlock)() = ^{
NSLog(@"我是個block");
};
// 既然是類似函數(shù)熊榛,void意思是block沒有返回值锚国;下面寫個有返回值的block
int (^sumBlock)(int a, int b) = ^(int a, int b){ // 有參數(shù)的時候不能省略括號了,不然在block內(nèi)部沒法使用參數(shù)了
return a + b;
};
// 這個block的功能是計算兩個整數(shù)的和
int sum = sumBlock(2, 3);
就這樣玄坦,block大概不陌生了血筑,也沒什么大不了的,就是包裝了某個功能的特殊函數(shù)煎楣;
那么問題來了豺总,為什么不直接使用函數(shù),而要使用block择懂,還搞的這么復(fù)雜喻喳;存在即合理,block肯定有它特殊的用處困曙;
如果仔細(xì)guan觀察表伦,會發(fā)現(xiàn)block都寫在了其他函數(shù)中,就像第一個最簡單的firstBlock就寫在main函數(shù)中慷丽,沒錯block比函數(shù)牛逼的地方是蹦哼,它可以寫在其他函數(shù)中,不僅如此要糊,你還可以把block當(dāng)做參數(shù)在不同的函數(shù)直接傳遞纲熏;
- block寫在其他函數(shù)中,可以和定義它的函數(shù)共享一個范圍內(nèi)的東西杨耙,也就是值捕獲赤套;
- block作為函數(shù)參數(shù)傳遞,穿梭在各個方法之間珊膜,代碼就不會松散容握;還有就是可以實現(xiàn)回調(diào),回調(diào)也可以用代理來實現(xiàn)车柠;
...未完待續(xù)