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));
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());