Object C Block的實現方式

2022-03-28 08:42:26 字數 2489 閱讀 9712

摘自:>

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, int

num2);

如果你的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 *)string

copycount:(

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...