重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
1 block是一個類型,block對象是一個C級別的語法和運行機制,它與標準的C函數類似,不同之處在于,它除了有可執行代碼以外,它還包含了與堆、棧內存綁定的變量。因此,Block對象包含著一組狀態數據,這些數據在程序執行時用于對行為產生影響
2 你可以用Block來寫一些可以傳到API中的函數語句,可選擇性地存儲,并可以使用多線程.作為一個回調,Block特別的有用,因為Block即包含了回調期間的代碼,又包含了執行期間需要的數據
3 由于Objective-C 和 C++ 都是衍生自 C,block被設計為可同時兼容三種語言
block的基本用法
1 用 "^" 操作符來聲明一個Block變量,并指明Block述句的開始,Block的主體部分包含在{}內,像下面的例子中一樣(與C語法一樣,";" 指明語句的結束
2 例:
3 int (^myBlock)(int) =^(int num){return num * nuItiplier;};
4
5 1)block最簡單形式
6 定義格式:
7 void test(){};---->void (test)()=^{};
8 返回值類型 (^變量名)(參數)=^{
9 代碼塊
10 };
11 調用格式:
12 block 變量名();
13
14 例如:
15 //定義block變量的同時進行賦值16 void(^myTest)()=^{
17
18 };
19 //先定義后賦值20 void (^myTest1)();
21 myTest1=^{
22
23 };
24
25 //使用block26 myTest();
27
28 帶有參數的block
29
30 void (^myBlock)(int ,int )=^(int x,int y){};
31
32 帶有參數并帶有返回值的block
33 int (^blockSum)(int,int)=^(int x,int y){return x+y};
block的typedef
1 指針回顧
2 指針和指針的關系
3
4 指針和數組之間的關系
5 1)指針和一維數組(數組指針)
6 2)指針和二維數組
7
8 指針和字符串
9
10 指針和函數
11 1)指針函數
12 2)函數指針
13
14 指針和結構體
15
16 指針和文件
17
18 函數指針的回顧
19 1)函數指針的使用:
20 函數指針變量定義的一般形式為:
21 類型說明符 (*指針變量名)();
22 其實"類型說明符" 表示被指函數的返回值的類型
23 (* 指針變量名)表示 * 后面的變量是定義的指針變量
24
25 typedef int (*newType)(int x ,int y);
26 newType 是別名
27
28 block別名的使用
29
30 1)
31 //MyBlock2 是一個bolock 變量名
32 //先定義block變量,再給變量賦值
33 // myBlock2 特點:
34 // 只能賦值這樣block ;1 沒有返回值 2沒有參數35 void (^myBlock2)();
36 myBlock2=^{};
37 myBlock2();
38
39 2)給沒有返回值 并且沒有參數的block類型起一個別名
40 typedef void (^newBlockType)();
41 //此時注意,newBlockType不再是一個block類型的變量名了,是一個新的類型42
43 newBlockType f1;//f1 是一個 沒有返回值,沒有參數類型的變量名44
45 f1=^{};
46 f1();
47
48 3)有參數的
49 typedef int (^newBlockType2)(int ,int);
50 new BlockType2 f2= ^(int numb,int num2){
51 return numb+num2;
52 };
53 int s =f2(20,12);
在block內部修改外部的值
1 需要在外部的變量前 加上__block
2
3 例如:
4 __block int m =1200;
5
6 void (^myBlock)()=^{
7 m=1000;
8 };
將block作為參數使用
1 void days(void (^dayBlock)(){
2 NSLog(@"起床");
3 dayBlock();
4 NSLog(@"起床");
5 }
6
7 //調用days有兩種方法 8 1)傳一個block類型的變量過去
9 void(^block1)()=^{};
10 days(block1);
11
12 2)調用函數的同時,同時傳遞參數
13 days(^{});
將block作為函數的返回值
1 1)使用typedef 定義一個新的類型
2 //給block起一個別名 3
4 typedef int (^newType)(int num1,int num2);
5
6 2)使用新類型作為函數的返回值
7
8 //定義一個返回值是block類型的函數 9 newType test4(){
10 newType work=^(int x,int y){
11 return x+y;
12 }
13 return work;
14 }
block使用技巧以及注意
1 1)block變量用作方法的參數的時候
2 最好把參數類型列表部分加上,具體的形參名
3 void test4(int (^myBlock)(int num1,int num2)){
4
5 }
6 //當block代碼塊直接作為函數的參數
7 //寫法發生變化了
8 //參數 這樣寫: ^int (int x,int y){return x+y;} 9 int main(int argc,const char *argv[]){
10 test4(^int(int num1,int num2)myBlock);
11 return 0;
12 }
13
14
15
16
17 block和函數的區別
18 1)定義方式不一樣
19 2)block是一個類型
20 3)函數不可以嵌套定義,block可以嵌套
21 4)block因為是一種數據類型,所以可以作為函數的參數和返回值
22 函數則不可以
23 5)block可以作為類型修飾變量,函數不行