ios中的block 可以說是一種函數(shù)指針,但更確切的講,其實際上其應該算是object-c對C++11中l(wèi)ambda的支持或者說是一個語言上的變體,其實際內(nèi)容是一樣的,C++的lambda我已經(jīng)有簡介過,現(xiàn)在說下ios中的block
Block的實際行為和Function很像,最大的差別是在可以存取同一個Scope的變量值。Block實體形式如下:
^(傳入參數(shù)列){行為主體};
Block實體開頭是“^”,接著是由小括號所包起來的參數(shù)列(比如 int a, int b, int c),return a*a;};
這是代表Block會回傳輸入值的平方值(int a 就是參數(shù)列, return a*a; 就是行為主體)。記得行為主體里最后要加“;”,因為是敘述,而整個{}最后也要加“;”,因為Block是物件實體。用法如下:
很奇怪吧?后面的小括號里面的5會被當成a的輸入值,然后經(jīng)由Block輸出 5*5 = 25指定給result這個變量。
有沒有簡單一點的方法嗯?不然每次都寫這么長?有。接下來介紹一個叫做Block Pointer的東西來簡化我們的寫法。
Block Pointer是這樣定義的:
回傳值(^名字)(參數(shù)列);
比如下面的例子:
是不是變的簡單了?
也可以吧Block Pointer當成參數(shù)傳遞給一個function,比如:
上面的三行代碼其實等價于下面這行代碼:
當其作為Object-C method的傳入值的話,需要把類型寫在變量前面,然后加上小括號。比如下面這種寫法:
存取變量
1、可以讀取和Block pointer同一個Scope的變量值:
下面來看一段很有意思的代碼:
為什么result 的值仍然是11?而不是8呢?事實上,myPtr在其主體中用到的outA這個變量值的時候做了一個copy的動作,把outA的值copy下來。所以,之后outA即使換成了新的值,對于myPtr里面copy的值是沒有影響的。
需要注意的是,這里copy的值是變量的值,如果它是一個記憶體的位置(地址),換句話說,就是這個變量是個指針的話,
它的值是可以在block里被改變的。如下例子:
原本mutableArray的值是{@"one",@"two",@"three"},在block里面被更改mutableArray后,就變成{@"one", @"two"}了。
2、直接存取static類型的變量
甚至可以直接在block里面修改outA的值,例如下面的寫法:
3、Block Variable類型的變量
在某個變量前面如果加上修飾字“__block”的話(注意,block前面有兩個下劃線),這個變量就稱作block variable。
那么在block里面就可以任意修改此變量的值,如下代碼:
因為myPtr和myPtr2都有用到num這個block variable,最終num的值為7.
新聞熱點
疑難解答