block就是一個代碼塊,但是它的神奇之處在於在內聯(inline)執行的時候(這和C++很像)還可以
傳遞參數。
同時
block本身也可以被作為參數在方法和函數間傳遞,
這就給予了block無限的可能。
block如何申明(對比於c語言中的函數申明)
[ 此帖被haoxue在2013-07-30 16:41重新編輯 ]
圖片:block如何申明.png

第一個區別,函數指針是對一個函數地址的引用,這個函數在編譯的時候就已經確定了。而block是一個函數對象,是在程序運行過程中產生的。在一個作用域中生成的block對象分配在棧(stack)上,和其他所有分配在棧上的對象一樣,離開這個作用域,就不存在了。
Block允許開發者在兩個對象之間將任意的語句當做數據進行傳遞,往往這要比引用定義在別處的函數直觀。
Block實體形式如下:
^(傳入參數列){行為主體};
Block實體開頭是“^”,接着是由小括號所包起來的參數列(比如 int a, int b, int c),行為主體由大括號包起來,專有名字叫做block literal。行為主體可以用return回傳值,類型會被compiler自動辨別。如果沒有參數列要寫成: ^(void)。
例如下面的一個例子:
^(int a){return a*a;};
這是代表Block會回傳輸入值的平方值(int a 就是參數列, return a*a; 就是行為主體)。記得行為主體里最后要加“;”,因為是敘述,而整個{}最后也要加“;”,因為Block是物件實體。
在ios開發中,blocks是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。Blocks可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:blocks是inline的,並且它對局部變量是只讀的。
Blocks的定義:
int (^myBlock) (int a,int b) = ^(int a,int b){
return a+b;
};
定義了一個名為myBlock的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,是不是有點像方法的定義?
Blocks可以訪問局部變量,但是不能修改。比如下面的代碼就會報編譯錯
int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
如果要修改就要加關鍵字:__block (注意,是兩個下划線"_")
__block int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
作為函數的參數,blocks某種意義上替代了回調函數或者delegate。當函數調用了,假設某個事件觸發,這時blocks里的內容就會運行。這樣有利於代碼的整合和閱讀,你不需要到處去實現委托方法了。
^(傳入參數列){行為主體};
Block實體開頭是“^”,接着是由小括號所包起來的參數列(比如 int a, int b, int c),行為主體由大括號包起來,專有名字叫做block literal。行為主體可以用return回傳值,類型會被compiler自動辨別。如果沒有參數列要寫成: ^(void)。
例如下面的一個例子:
^(int a){return a*a;};
這是代表Block會回傳輸入值的平方值(int a 就是參數列, return a*a; 就是行為主體)。記得行為主體里最后要加“;”,因為是敘述,而整個{}最后也要加“;”,因為Block是物件實體。
在ios開發中,blocks是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。Blocks可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:blocks是inline的,並且它對局部變量是只讀的。
Blocks的定義:
int (^myBlock) (int a,int b) = ^(int a,int b){
return a+b;
};
定義了一個名為myBlock的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,是不是有點像方法的定義?
Blocks可以訪問局部變量,但是不能修改。比如下面的代碼就會報編譯錯
int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
如果要修改就要加關鍵字:__block (注意,是兩個下划線"_")
__block int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
作為函數的參數,blocks某種意義上替代了回調函數或者delegate。當函數調用了,假設某個事件觸發,這時blocks里的內容就會運行。這樣有利於代碼的整合和閱讀,你不需要到處去實現委托方法了。
來源:http://blog.sina.com.cn/s/blog_7c8dc2d50101kwih.html