OC 之block型別剖析

2021-08-27 21:58:13 字數 1968 閱讀 6361

1、block用來儲存一段**

2、block跟函式很像(block變數與函式指標很像)

(1)可以儲存**

(2)有返回值

(3)有形參

(4)呼叫方式相同

3、block語法格式:

(1)返回值型別 (^block變數名) (引數型別1,引數型別2……)=

^(引數型別1 形參1,引數型別2 形參2……) ;

(2)注意:如果block沒有形參,後面的括號可以省略,即

返回值型別 (^block變數名) =^; ——>定義結尾必須要用「;」分號;

(3)宣告和語句可以分開來寫:

返回值型別 (^block變數名) (引數型別1,引數型別2……);

block變數名=

^(引數型別1 形參1,引數型別2 形參2……) ;

呼叫方式:直接 block變數名()或***=block變數名(……);

4、block要掌握的內容:

(1)如何定義block變數,如

int (^sumblock)(int,int);

void(^myblock)();

(2)如何利用block封裝**

^(int a,int b);

^();無形參情況下在封裝**時空括號可以去掉如下:^;

(3)block訪問外部變數

block內部可以訪問外部變數。

預設情況下,block內部不能修改外面的區域性變數。

在外部定義區域性變數時加上__block(雙下劃線)關鍵字,block內就可以修改此變數了。

(4)利用typedef定義block型別

typedef int(^myblock)(int,int);

//以後就可以利用myblock這種型別來定義block變數

如: 先定義block變數 ,再賦值

myblock b1,b2;//表示b1,b2都是myblock這種型別

b1=^(int a,int b);

也可以定義的同時賦值

myblock b3=(int c,int d);

切記:定義完畢或賦值完畢後不要忘記加分號「;」。

**驗證,例項如下:

//

// main.m

// block

////

#import typedef int (^myblock) (int,int);

void test1();

int (^block1)(int, int);

block1 = ^(int a,int b);

void (^block2)() = ^;

void (^block3) ();

block3=^;

printf("test1()測試如下-------------------\n");

printf("block(5,6)=%d,block1(7,8)=%d\n",block(5,6),block1(7,8));

block2();

block3();

}void test2();

myblock minus=^(int a,int b);

myblock multy=^(int a,int b);

printf("test2()測試如下------------------- \n");

printf("add(5,3) = %d\n",add(5,3));

printf("minus(3,9) = %d\n",minus(3,9));

printf("multy(7,8) = %d\n",multy(7,8));

}int main(int argc, const char * argv)

return 0;

}

執行結果如下:

OC底層 block型別

block繼承自nsblock,nsblock繼承自nsobject 分為三種 怎麼樣建立三種block?void test void test 如下圖 呼叫了auto遍歷的block呼叫了copy時,就會生成 nsmallocblock型別的block,這是將放在棧中的block放進了堆記憶體中,...

OC學習筆記之block

一 什麼是block block是oc中的乙個資料型別,但是它很特別,因為它是用來儲存一段 的 可以理解為把一段 賦值給block型別的變數 它和函式有點相似,它可以帶引數,可以有返回值,呼叫方式也一樣。二 定義乙個不帶形參沒有返回值的block main.m block created by 葬花...

OC之block 和協議

一 bolck 一 簡介 block是什麼?蘋果推薦的型別,效率高,在執行中儲存 用來封裝和儲存 有點像函式,block可以在任何時候執行。bolck和函式的相似性 1 可以儲存 2 有返回值 3 有形參 4 呼叫方式一樣。識別符號 二 基本使用 1 定義block變數 int sumblock i...