ios4.0系統已開始支持block,在編程過程當中,blocks被Obj-C當作是對象,它封裝了一段代碼,這段代碼能夠在任什麼時候候執行。Blocks能夠做爲函數參數或者函數的返回值,而其自己又能夠帶輸入參數或返回值。它和傳統的函數指針很相似,可是有區別:blocks是inline的,而且它對局部變量是隻讀的。ios
下面是理論部分:編程
一、block的定義函數
1 // 聲明和實現寫在一塊兒,就像變量的聲明實現 int a = 10; 2 int (^aBlock)(int, int) = ^(int num1, int num2) { 3 4 return num1 * num2; 5 6 }; 7 // 聲明和實現分開,就像變量先聲明後實現 int a;a = 10; 8 int (^cBlock)(int,int); 9 cBlock = ^(int num1,int num2) 10 { 11 return num1 * num2; 12 };
其中,定義了一個名字爲aBlock的blocks對象,並攜帶了相關信息:優化
一、aBlock 有兩個形式參數,分別爲int類型;spa
二、aBlock 的返回值爲int 類型;代理
三、等式右邊就是blocks的具體實現;指針
四、^ 帶邊blocks聲明和實現的標示(關鍵字);code
固然,你能夠定義其餘形式的block。e.g:無返回值,無形式參數等;對象
1 void (^bBlock)() = ^() 2 { 3 int a = 10; 4 printf("num = %d",a); 5 };
二、blocks 訪問權限blog
blocks能夠訪問局部變量,可是不能修改。
1 int a = 10; 2 int (^dBlock)(int) = ^(int num) 3 { 4 a++;//not work! 5 return num * a; 6 };
此處不能修改的緣由是在編譯期間肯定的,編譯器編譯的時候把a的值複製到block做爲一個新變量(假設是a‘ = 10),此時a'和a是沒有關係的。
這個地方就是函數中的值傳遞。若是要修改就要加關鍵字:__block或者static
1 __block int a = 7; 2 int (^dBlock)(int) = ^(int num) 3 { 4 a++;// work! 5 return num * a; 6 };
三、block的調用
block調用就像調用函數同樣。e.g:
int c = aBlock(10,10);
bBlock();
四、block 應用
假設咱們熟悉代理遞值的話,對代理咱們可能又愛有恨!咱們先創建模型A頁面 push B頁面,若是把A頁面的值傳遞到B頁面,屬性和單例傳值能夠搞定!可是若是Pop過程當中把B頁面的值傳遞到A頁面,那就能夠用單例或者代理了!說到代理,咱們要先聲明協議,建立代理,非常麻煩。經常咱們傳遞一個數值須要在兩個頁面間寫不少代碼,這些代碼改變頁面的總體順序,可讀性也打了折扣。因此,此時,block是一種優化方案!你們累了,休息下,預知後事如何,傾聽下回分解...