block 語法
block語法 -> 塊語法
標(biāo)準(zhǔn)C里面沒有Block, C語言的后期擴展版本, 加入了匿名函數(shù); C++, JS, Swift等語言中, 有類似語法, 叫做閉包!
block語法和函數(shù)指針很相似
回顧, C語言中的指針函數(shù):int(*) (int x, int y) 即: 指向兩個整型參數(shù), 一個整型返回值函數(shù)的指針!
Block函數(shù), 沒有名稱的函數(shù);
例如 int(int x, int y)
因為Block是匿名函數(shù), block變量的存放的函數(shù)的實現(xiàn), 通過block變量能直接調(diào)用函數(shù), 沒有名稱的函數(shù)該如何調(diào)用呢? (有名稱的話, 可以直接調(diào)用, 也可以通過函數(shù)指針來調(diào)用)
例如定義C語言的函數(shù)指針!
int sum (int x, int y) {
return x+ y;
}
// 定義函數(shù)
int (*p)(int, int) = sum;
NSLog(@"%ld", p(2, 5));
// 函數(shù)指針類型: int (*)(int, int);
// 函數(shù)指針變量: p;
// 函數(shù)指針的值: sum
看看block語法
block類型: int(^)(int, int)
block變量: block
block值: ^(int x, int y){
return x + y ;
};
定義block語法塊
int (^block) (int , int) = ^(int x, int y) {
return x + y;
}
NSLog(@"%d", block(3, 5));
效果和上邊的函數(shù)指針一樣! 參照起來學(xué)習(xí)方便!
-
無返回值, 無參數(shù) block 語法
void(^block1)(void) = ^(void) { NSLog(@"無返回值, 無參數(shù)"); } // 調(diào)用block1 block1(); 有返回值, 無參數(shù)
int(^block2)(void) = ^(void) {
return 1;
}
NSLog(@"有返回值, 無參數(shù)%d", block2());無返回值, 有參數(shù)
void (^block3)(int, int) = ^(int x, int y){
NSLog(@"%d + %d = %d", x, y, x +y);
};
調(diào)用
block3(3, 5);有返回值, 有參數(shù)
int (^block4)(int , int) = ^(int x, int y) {
return x + y;
}
block 調(diào)用
NSLog(@"%d", block4(3, 5));
block 與變量的關(guān)系
- block 與 局部變量的關(guān)系
int temp = 100;
void (^block1)(void) = ^(void) {
NSLog(@"%d", temp++);
NSLog(@"%d", temp + 1);
}
調(diào)用 block1();
如果按照以上代碼, 第一個打印會報錯!! 因為對temp進行了操作, 也就是說在block中是不能修改局部變量的值的! 而第二個打印卻不會報錯, 說明block中可以調(diào)用局部變量! 那怎樣才能在block中修改局部變量的值呢?
__block int temp2 = 200;用__block修飾一下變量, 便在block可以使用了
__block int temp2 = 200;
void (^block9) (void) = ^(void){
temp2++; // 這樣就可以修改了!
};
調(diào)用 block9();
結(jié)果 201; - block與全局變量.
在main函數(shù)外定義一個在main函數(shù)外定義一個temp3 = 300;
void (^block11) (void) = ^(void){
temp3++;
NSLog(@"temp3 = %d", temp3 + 1);
};
調(diào)用 block11();
結(jié)果 temp3 = 301;
說明block中可以修改全局變量!
block 用戶熟練了, 用處大大的!!!