IOS中block的使用方法

2022-05-03 21:27:13 字數 2583 閱讀 5554

x.1 初探block

在這一小節我們先用一些簡單範例來匯入block的概念。

x.1.1 宣告和使用block

我們使用「^」運運算元來宣告乙個block變數,而且在block的定義最後面要加上「;」來表示乙個完整的述句(也就是將整個block定義視為前面章節所介紹的簡單述句,因為整個定義必須是乙個完整的句子,所以必須在最後面加上分號),下面是乙個block的範例:

2: int (^myblock)( int ) = ^( int num)
3: ;

我們使用下圖來解釋這個範例(請將文字框的字翻譯如下):

我們宣告乙個「myblock」變數,用「^」符號來表示這是乙個block。

這是block的完整定義,這個定義將會指定給「myblock」變數。

表示「myblock」是乙個回傳值為整數(int)的block。

它有乙個引數,型態也是整數。

這個引數的名字叫做「num」。

這是block的內容。

值得注意的地方是block可以使用和本身定義範圍相同的變數,可以想像在上面的例子中 multiplier 和 myblock 都是某乙個函式內定義的兩個變數也就是這個變數都在某個函式兩個大括號「」中間的區塊,因為它們的有效範圍是相同的,因此在block中就可以直接使用 multiplier 這個變數,此外當把block定義成乙個變數的時,我們可以直接像使用一般函式般的方式使用它:

2: int (^myblock)( int ) = ^( int num)
3: ;
6: printf ( "%d" , myblock( 3 ));
7: //結果會列印出21

x.1.2 直接使用block

在很多情況下,我們並不需要將block宣告成變數,反之我們可以直接在需要使用block的地方直接用內嵌的方式將block的內容寫出來,在下面的例子中qsort_b函式,這是乙個類似傳統的qsort_t函式,但是直接使用block做為它的引數:

2: qsort_b (mycharacters, 3 ,
3:          sizeof ( char *),
4:          ^( const void *l, const void *r)//block部分
5:                                         //end
10: );

x.1.3 __block 變數

一般來說,在block內只能讀取在同乙個作用域的變數而且沒有辦法修改在block外定義的任何變數,此時若我們想要這些變數能夠在block中被修改,就必須在前面掛上__block的修飾詞,以上面第乙個例子中的 multiplier 來說,這個變數在 block 中是唯讀的,所以 multiplier = 7 指定完後,在 block 中的 multiplier 就只能是 7 不能修改,若我們在 block 中修改 multiplier ,在編輯時就會產生錯誤,因此若想要在 block 中修改 multiplier ,就必須在 multiplier 前面加上 __block 的修飾詞,請參考下面的範例:

2: int (^myblock)( int ) = ^( int num)
3:
8:     else
9:
12:     return num * multiplier;
13: };

使用block的示例**

- (void

)viewdidload

;

void (^blockfinished)(bool finished) = ^(bool finished);

[uiview animatewithduration:

1.0animations:blockanimation completion:blockfinished];

}

帶有引數的block示例**

和把block作為函式引數的示例**

- (void

)viewdidload

;

int numa = 1

;

int numb = 2

;

int numsum =blockadd(numa, numb);

nslog(

@"%d

", numsum);

[self testfuncionusingblock:blockadd];

int (^ blocksub)(int, int) = ^(int a, int

b); [self testfuncionusingblock:blocksub];

}- (void)testfuncionusingblock:(int (^)(int, int

))block

IOS中Block的使用

block的宣告 1,void myblock 2,int myblock float,int 3,nsstring myblock int,nsstring 也可以使用typedef為block定義別名。三種block的特性 block是乙個object物件,所以我們需要對它進行記憶體管理。blo...

IOS中delegate的使用方法

寫了乙個簡單的委託的試用測試 首先建立functiontest類,宣告委託 functiontest.h functiontest.h delegatedemo created by shx on 12 7 17.import protocol functiontestdelegate inte c...

iOS中UIAlertView的使用方法

uialertview alertview uialertview alloc initwithtitle nil message 真的要退出?delegate self cancelbuttontitle 確定 otherbuttontitles 取消 nil alertview.tag 11 a...