標籤:style blog color 使用 strong 資料
一:block基礎知識
block基礎知識
基本概念:block是用來儲存一段代碼的;^:是block得標誌 好比*:是指標的標誌
特點:1:儲存一段代碼;
2:可以有參數和傳回值;
3:可以作為函數的參數傳遞;
與代碼塊的區別,代碼塊裡的代碼會自動執行,block中代碼要手動調用;
二:普通資料類型、指向函數的指標、block的定義的類比
1:基礎資料型別 (Elementary Data Type):
例如:int a = 10;
格式:資料類型 變數名 = 值;
2:指向函數的指標:可以仿照上邊基礎資料型別 (Elementary Data Type)的定義
例如:void (*p)() = function; (funciton是某個定義好的函數)
格式:函數類型 *指標變數名 = 函數名;
說明:由於p指標是指向函數的,所以(*p)()中的紅色小括弧必須有,因為函數本身是要參數的,即使沒有參數也要寫();
如果p指向的函數有參數:int (*pp)(int, int) = sum;
調用指向函數的指標:
無參:p();
有參:int sum = pp(2,3);
3:block的定義和使用,和指向函數的指標格式很像
例如:void (^firstBlock)() = ^(){...代碼...}; 說明:藍色的小括弧可以不寫,有參數的時候必須寫
格式:block類型 ^block名稱 = ^{程式碼片段};
有參數block:int (^multiBlock)(int, int) = ^(int a, int b){
return a * b;
};
調用block:無參:firstBlock()
有參:int result = multiBlock(2, 3);
// 備忘:指向指標的函數和block,可以像基礎資料型別 (Elementary Data Type)一樣可以分步定義 :int (^multiBlock)(int, int); multiBlock = ^(int a, int b){ return a * b; };
範例程式碼:
1 // 函數定義 2 int sum(int a, int b) 3 { 4 NSLog(@"a+b=%d", a + b); 5 return 2; 6 } 7 8 void logSome() 9 {10 NSLog(@"我是void型的輸出函數");11 }12 13 int main()14 {15 /*** 1:基礎資料型別 (Elementary Data Type)的定義 ***/16 int a = 10;17 // 1.1先定義 後賦值18 int b;19 b = 20;20 21 /*** 2:指向了函數的指標 ***/22 23 // 2.1:指向有參數的sum(int a, int b)函數24 int (*p)(int, int) = sum;25 // 2.2:指向無參數的函數logSome()函數26 void (*logP)() = logSome;27 28 // 調用指向函數的指標函數29 p(2, 3);30 logP();31 32 /*** 3:block定義和使用 ***/33 34 // 3.1:沒有參數的block定義35 void (^firstBlock)() = ^{36 37 NSLog(@"注意:(^multiBlock)(),這裡的小括弧必須寫,不管有沒有參數");38 39 NSLog(@"而後邊的\" ^(){ \"的小括弧可以不寫");40 };41 42 // block的調用43 firstBlock();44 45 // 3.2 帶參數和有傳回值的block46 int (^multiBlock)(int, int) = ^(int a, int b){47 return a * b;48 };49 50 // 調用block51 int result = multiBlock(2, 3);52 NSLog(@"%d", result);53 54 }
三:利用typedef 定義的block
利用typedef可以將繁瑣的block定義簡單化
例如:typedef void (^Myblock)(); 然後可以用Myblock 建立一個block,建立的格式像類建立對象
// 利用typedef定義blocktypedef void (^Myblock)();int main(){ // 利用自訂的block建立一個block Myblock myblock = ^{ NSLog(@""); }; }
四:block和指向函數的指標作為函數參數
利用typedef可以將繁瑣的block簡單後,這個block就成為了一種類型,可以像類一樣建立對象,指向函數的指標同樣可以
// 利用typedef定義定義指向函數的指標typedef void (*Tp)();// 利用typedef定義blocktypedef void (^Myblock)();void logSome(){ NSLog(@"我是void型的輸出函數");}// 指向函數的指標作為參數void test1(Tp p){ p();}// block作為函數的參數void test2(Myblock mb){ mb();}int main(){ // 指向函數的指標定義 Tp myP = logSome; test3(myP); // 定義block Myblock mb = ^{ NSLog(@"block輸出"); }; test4(mb);}
備忘:c語言中的函數和oc中的方法有些不一樣,c語言函數的參數要想寫block後者指向函數的指標,必須先用typedef吧block或者指向函數的指標定義為一種類型,然後才能在函數的參數中傳遞;
在oc的方法定義中,可以直接用block來作為參數;