OC學習筆記之block

2021-06-22 01:11:26 字數 2354 閱讀 2832

一、什麼是block

block是oc中的乙個資料型別,但是它很特別,因為它是用來儲存一段**的(可以理解為把一段**賦值給block型別的變數)。它和函式有點相似,它可以帶引數,可以有返回值,呼叫方式也一樣。

二、定義乙個不帶形參沒有返回值的block

//

// main.m

// block

//// created by 葬花 橋 on 14-5-13.

//#import int main()

; myblock(); // 呼叫block

三、帶引數有返回值的block

//

// main.m

// block

//// created by 葬花 橋 on 14-5-13.

//#import int main();//

// myblock(); // 呼叫block

int (^sumblock)(int, int) = ^(int a, int b);

int c = sumblock(1, 2); // 呼叫block

nslog(@"sumblock返回值為%d",c);

return 0;

}

三、block與函式指標

block與函式指標是非常相似的,小橋在這裡演示一下:

//

// main.m

// block

//// created by 葬花 橋 on 14-5-13.

//#import int sum(int a, int b)

int main()



上面的指標p就是乙個指向函式的指標,函式指標在c語言中用的比較多,特別是linux系統核心中,c語言用結構體並且在結構體中用函式指標來模擬類的方法,用以達到物件導向的效果,所以說物件導向程式設計是一種思想而不是一種特定的程式語言,這是題外話。

如果用block來寫同樣的求和功能,是這樣的:

int sum(int a, int b)

int main()

; nslog(@"sumblock返回值為%d", sumblock(4, 5));

四、block與typedef

複雜型別可以用typedef來定義簡潔的形式,這在c++的視覺化程式設計的mfc框架中經常見到,一些奇怪的資料型別其實是已知型別的另一種形式。

typedef把block的定義重新定義成乙個簡潔的形式,如:

int sum(int a, int b)

typedef int (*sump)(int, int); // 定義乙個sump型別,它可以定義出乙個返回值為int,兩個int形參的函式指標

typedef int (^myblock)(int, int); // 定義乙個myblock型別,它可以定義出乙個返回值為int,兩個int形引數的block變數

int main()

; nslog(@"sumblock返回值為%d", sumblock(4, 5));

sump p2 = sum; // 定義乙個函式指標p2

所以,如果需要多個block,返回的都是int,引數都是兩個int,那麼就可以用typedef定義的myblock型別繼續定義多個block變數,功能可以不一樣,可以是兩個int的加,減,除等等。這樣做可以減少**量,小橋覺得主要還是在**上增加可讀性,我們對

inta;這種形式很熟悉,但是對

int(^sumblock)(

int, 

int)

這種形式就不那麼熟悉了,所以用typedef定義後的

myblock sumblock2;

就變成我們熟悉的語法了。  



OC學習筆記(1) block

斷斷續續,今天又開始學oc了 今天的內容是 block block 是用來儲存一段 block 的標記是 block 和 其它語言的函式很像 1.可以儲存 2.有返回值 3.有形參 4.呼叫方式一樣 定義 block 變數的方法如下 void myblock int c sumblock 10,20...

OC學習筆記十 Block與 protocol

block是一種資料型別,封裝了一段 可以在任何時候執行。block 可以在程式執行時儲存一段 函式不行 block 跟函式一樣,有返回值,形參。block 以 表示一段 block block變數 以 返回值型別 block 名稱 形參型別 表示乙個 block 型別的變數。和以前學過的 c語言的...

Oc課堂筆記 Block塊

block塊 可以傳到任何地方使用 託字元 1.無返回值 無引數的block void myblock myblock 2.有返回值有引數 nsinteger sumblock nsinteger,nsinteger nsinteger num1,nsinteger num2 sumblock 10...