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