iOS-block全局变量和局部变量的引用

1、全局变量,block可以进行读取和修改。

@interface ViewController () {
    NSInteger num;
} 

@implementation ViewController 
- (void)viewDidLoad { 
    //1、block修改成员变量
    void (^block1)() = ^(){ 
        ++num;
        NSLog(@"调用成员变量: %ld", num);
    };
    block1();
}

2、局部变量,block只能读取,不能修改局部变量。这个时候是值传递,如果想修改局部变量,要用__block来修饰,这个时候是引用传递。下面会聊下block的实现原理:
看例子:

 //1、调用局部变量,不用__block
  NSInteger testNum = 10; 
  void ( ^ blockNum )() = ^() { 
        //testNum = 1000; 这样是编译不通过的
        NSLog(@"修改局部变量: %ld", testNum);    //打印:10
  };

   testNum = 20;
   blockNum();
   NSLog(@"testNum最后的值: %ld", 20);           //打印:30 

  //2、修改局部变量,要用__block
  __block NSInteger testNum2 = 10; 
  void (^blockNum2)() = ^() {
        NSLog(@"读取局部变量: %ld", testNum2);   //打印:20
        testNum2 = 1000;
        NSLog(@"修改局部变量: %ld", testNum2);   //打印:1000
   };
    testNum2 = 20;
    blockNum2();
    testNum2 = 30;
    NSLog(@"testNum最后的值: %ld", testNum2);  //打印:30

参考地址

你可能感兴趣的:(iOS-block全局变量和局部变量的引用)