摘自:>
date : 2015-12-4
前言:我們可以把block當作乙個閉包函式,它可以訪問外部變數和區域性變數,但預設是不可以修改外部變數。你可以使用它來做**方法,比起使用**(delegate)會更加直觀。順帶一提,蘋果很多的介面(api)都使用了block。
一、block的基本定義
block的基本寫法(也是詳細寫法):
returntype (^blockname)(params) = ^returntype(params) ;
中文再解釋:返回型別 (^block的名字)(block的引數) = ^返回型別(block的引數) ,例:
int (^myblock)(int num1, int num2) = ^int(int num1, intnum2);
如果你的block不需要返回型別和引數,那麼你可以簡寫為:
void (^myblock2)() = ^();
或
void (^myblock2)(void) = ^void(void);
返回型別或引數,沒有的話可以用「void」代替。
你也可以把等於號右邊,^後的()刪除,即是:
void (^myblock2)() = ^;
這樣是不是很簡潔?
你也可以先定義乙個block函式,但不寫函式的實現,我們可以在後面再寫具體函式的實現,像這樣:
void (^myblock2)(void);myblock2 = ^;
二、block作為方法定義
把block定義在方法裡,與上面不同的是,block的名字不需要在宣告時寫上,而是在後面,像這樣:
- (void)getwtihblock:(void (^)())block
使用方法:
[self getwtihblock:^];
下面作了乙個詳細點的例子,並寫了備註:
/** * 追加自身字串n次(每次複製前加乙個換行\n)
* * @param string 字串
* @param count 追加次數
* @param stringblock 目標block,其中str引數為結果字串 */
//block也可以定義在方法裡,但是不需要定義block的名字 //
ios開發很多的api也用到了block,像uiview的塊動畫
- (void)getstrwithstring:(nsstring *)string
copycount:(
int)count
resultstring:(
void (^)(nsstring *str))stringblock
//呼叫block,傳入字串newstring
stringblock(newstring);
}
用法也是一樣:
blockobject *block =[[blockobject alloc] init];[block getstrwithstring:
@"garvey
"copycount:
3resultstring:^(nsstring *str) ];
有時候複雜的block語法會令到函式的宣告難以閱讀,所以會經常使用typedef對block起乙個新型別。
typedef void (^resultblock)(nsstring *str);
定義方法時就變成了:
- (void)getstrwithstring2:(nsstring *)stringcopycount:(
int)count
resultstring:(resultblock)stringblock;
讓我們對比一下,使用typedef前後:
//使用前- (void)getstrwithstring:(nsstring *)string
copycount:(
int)count
resultstring:(
void (^)(nsstring *str))stringblock;
//使用後
- (void)getstrwithstring2:(nsstring *)string
copycount:(
int)count
resultstring:(resultblock)stringblock;
注意:使用方法是一樣的,只不過定義變得簡單了。
如果你一直在使用**(delegate)進行方法**,那麼你現在可以嘗試使用block了。
博文出處:
Object c block需要注意的幾點問題
摘自 date 2015 12 4 1.block定義 1 說明 a.block是oc中的一種資料型別,在ios開發中被廣泛使用 b.是block的特有標記 c.block的實現 包含在 之間 d.大多情況下,以內聯inline函式的方式被定義和使用 e.block與c語言的函式指標有些相似,但使用...
ios push實現的簡單實現步驟
其實push這個東西已經做了好幾次了,但是每次要做的時候總會先下意識地上網搜尋 因為個人覺得ios開發的時候證書和簽名實在是讓人頭疼,可能還是不夠熟悉整套ios開發與發布流程的原因 過些天專案裡要加push的推送功能,所以先做了下功課,大致記錄了步驟,免得到時候又忘記.a 本地鑰匙串生成證書請求檔案...
SAP BADI的實現2 實現BADI
1,建立實現體的容器 定義和實現badi有乙個共同的地方,就是都是需要建立乙個容器,我們不能新建乙個badi的實現,如果沒有先建立容器的話。在同乙個容器中,可以有多個badi實現,但是前提是要求他們都是屬於同乙個enhancement spot所對應的badi。2,badi類實現 在我們建立了bad...