block内部引用全局变量和局部变量一直都是一个坑 block与局部变量
- (void)aboutBlock1{ __block int index = 100; int (^myBlock)(int addNum) = ^(int addNum){ index += addNum; return index; }; NSLog(@"在内部修改了局部变量值后 == %d",myBlock(50)); //打印结果 在内部修改了局部变量值后 == 150 NSLog(@"在内部修改了局部变量值后再打印 == %d",myBlock(50)); //打印结果 在内部修改了局部变量值后再打印 == 200 index = 50; NSLog(@"在外部修改了局部变量值后 == %d",myBlock(50)); //打印结果 在外部修改了局部变量值后 == 100}用__block修饰了局部变量之后,在block内部和外部都可以对局部变量进行修改。
- (void)aboutBlock2{ int block2 = 20; int (^myBlock2)(void) = ^(){ return block2; }; NSLog(@"局部变量不用__block修饰外部不修改 == %d",myBlock2()); //打印结果 局部变量不用__block修饰外部不修改 == 20 block2 = 40; NSLog(@"局部变量不用__block修饰外部修改 == %d",myBlock2()); //打印结果 局部变量不用__block修饰外部修改 == 20}如果不用__block修饰block,block内部不可以对局部变量进行修改,否则编译不通过。且在block外部修改变量值,并不影响block捕获的局部变量值,这种情况,block内部的局部变量的值只是block捕获局部变量时的值。如下边代码:
block2 = 40; NSLog(@"局部变量不用__block修饰外部修改 == %d",myBlock2()); //打印结果 局部变量不用__block修饰外部修改 == 20block捕获block2这个局部变量值时,block2的值为20,所以在调用block之前修改block2的值为40,对block不起作用。
block与全局变量
//全局变量numble初始化赋值70
@interface ViewController ()@PRoperty (nonatomic, assign) int numble;@end- (void)aboutBlock3{ __weak typeof(self) weakself = self; int (^myBlock3)(int addNum) = ^(int addNum){ return weakself.numble + addNum; }; NSLog(@"全局变量不用__block修饰外部不修改 == %d",myBlock3(30)); //打印结果 全局变量不用__block修饰外部不修改 == 100}- (void)aboutBlock4{ __weak typeof(self) weakself = self; int (^myBlock4)(int addNum) = ^(int addNum){ return weakself.numble + addNum; }; self.numble = 170; NSLog(@"全局变量不用__block修饰外部修改 == %d",myBlock4(30)); //打印结果 全局变量不用__block修饰外部修改 == 200}block内部引用局部变量,不使用__block修饰,在block外部改变了局部变量的值,block内部的局部变量只保存了捕获时的值。block内部引用全局变量,在block外部修改了全局变量的值,block捕获的是当前的值。
- (void)aboutBlock6{ __weak typeof(self) weakself = self; int (^myBlock6)(int addNum) = ^(int addNum){ return weakself.numble += addNum; }; NSLog(@"全局变量在block内部被修改 == %d",myBlock6(50)); //打印结果 全局变量在block内部被修改 == 220}block内部引用局部变量,不用__block修饰,不可以修改局部变量的值,但是block内部引用全局变量,可以在block内部修改全局变量的值。
提示:为了避免循环引用,在block内部应该使用weakself。(__weak typeof(self) weakself = self;)
static修饰全局变量对block的影响
static int block5 = 15;- (void)aboutBlock5{ int (^myBlock5)(int addNum) = ^(int addNum){ return block5 + addNum; }; NSLog(@"static全局变量在block内部不被修改 == %d",myBlock5(50)); //打印结果 static全局变量在block内部不被修改 == 65}- (void)aboutBlock7{ int (^myBlock7)(int addNum) = ^(int addNum){ return block5 += addNum; }; myBlock7(70); NSLog(@"static全局变量在block内部被修改 == %d",block5); //打印结果 static全局变量在block内部被修改 == 85}static定义一个内部变量,在block内部可以修改
- (void)aboutBlock8{ int (^myBlock8)(int addNum) = ^(int addNum){ return block5 += addNum; }; block5 = 35; NSLog(@"全局变量在block内部和外部都被修改(没有调用block) == %d",block5); myBlock8(50); NSLog(@"全局变量在block内部和外部都被修改 == %d",block5); //打印结果 全局变量在block内部和外部都被修改(没有调用block) == 35 全局变量在block内部和外部都被修改 == 85}block内部static修饰局部变量
- (void)aboutBlock9{ static int block9 = 40; int (^myBlock9)(int addNum) = ^(int addNum){ return block9 += addNum; }; myBlock9(30); NSLog(@"static修饰局部变量,block内部修改 == %d",block9); //打印结果 static修饰局部变量,block内部修改 == 70}static修饰了局部变量,延长了局部变量的生命周期,在block内部也是可以对局部变量进行修改的
- (void)aboutBlock10{ static int block10 = 40; int (^myBlock10)(int addNum) = ^(int addNum){ return block10 += addNum; }; block10 = 80; NSLog(@"static修饰局部变量,block外部修改 == %d",myBlock10(30)); //打印结果 static修饰局部变量,block外部修改 == 110}在block外部修改static修饰的局部变量,发现也是能够修改的。
新闻热点
疑难解答