標籤:objective-c ios
一、Block文法
Block:塊文法,本質上是匿名函數(沒有名稱的函數),Block變數存放函數的實現,通過Block變數能直接調?函數。標準C裡面沒有Block,C語言的後期擴充版本,加?了匿名函數。C++、JS、Swift等語?,有類似文法,叫做閉包。Block文法和函數指標很相似。
- Block類型:int (^)(int)
- Block變數:myBlock
- Block值:^ int (int num){ return 7 * num;}
- 即:^ 傳回值類型 (參數列表){函數體} 其中 傳回值類型 可以省略。
/* Block 類型: int (^)(int, int) * Block 變數: block1 * Block 的值: ^int (int x, int y) { return x + y; }; ^ 傳回值類型 (參數列表) { 函數體 } (傳回值類型可以省略) */ /* 1. 無傳回值, 無參數的Block */ void (^block3)() = ^() { NSLog(@"Hello, World!"); }; block3(); /* Block調用 */ /* 2. 無傳回值, 有參數 */ void (^block4)(int, int) = ^(int x, int y) { NSLog(@"%d", x + y); }; block4(3, 45); /* 3. 有傳回值, 無參數 */ int (^block5)() = ^() { return 100; }; NSLog(@"%d", block5()); /* 4. 有傳回值, 有參數 */ int (^block6)(int, int) = ^(int x, int y) { return x > y ? x : y; }; NSLog(@"%d", block6(3, 5));
二、Block使?
int (^block1)(int x, int y) = ^(int x, int y) { return x + y;};int a = block1(32, 34); // block的使?和函數指標的使用類似NSLog(@“%d”, a); // 列印結果:66
Block進?typedef
typedef int (^BlockType)(int x, int y)
原類型:int (^)(int x, int y)
新類型:BlockType
/* Block typedef */typedef int(^blockType)(int, int);blockType block1 = ^(int x, int y) { return x + y; };NSLog(@"%d", block1(3, 5));
Block寫法
int (^block1)(int x, int y) = ^(int x, int y) { return x + y;};
BlockType block1 = ^(int x, int y) { return x + y;};
上述兩種實現是等價的。
Blcok與局部變數和全域變數
/* main函數外定義的全域變數 */ int n = 100; /* 知識點4 Block與局部變數 全域變數 */ /* 局部變數 */ int a = 100; int (^block)() = ^() { return a; }; NSLog(@"%d", block()); int (^block2)() = ^() {// a = 200; return a; }; /* 總結: 預設情況下, block可以訪問但不能更改局部變數 */ __block int b = 200; int (^block3)() = ^() { b = 300; return b; }; NSLog(@"%d", block3()); /* 總結: 用__block修飾的局部變數, Block裡面可以更改值 */ /* Block 與全域變數 */ int (^block4)() = ^() { n = 200; return n; }; NSLog(@"n = %d", block4()); static int num = 1; int (^block5)() = ^() { num = 8; return num; }; NSLog(@"num = %d", block5());
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C學習筆記_Block