block的概念數組
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 //使用block 26 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內部修改外部的值spa
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能夠做爲類型修飾變量,函數不行