block的简单介绍

block作为OC中经常使用的代码块,现在在越来越多的地方被使用。她类似于函数,又比函数更灵活。函数在编译前就已经确定了,但是block的代码块确是不确定的,block还有个特点就是可以作为方法的参数被使用,可以跨页面传值,在实际开发中,充当了很多代理的功能。

1.block的定义

第一种:(直接写)

@property (copy) void(^MyBlock)(void); 

第二种:(typedef)

typedef void(^MyBlock)(void); 

@property (nonatomic, copy) MyBlock block;

常规定义如下

  int (^myblock)(int) = ^(int num){

  return num * 7;

  };

   调用的时候

  int result = myblock(8);

  

2.block传参

  block不能改变传入block中的参数的值,真正传给block的只是参数的副本     

int a = 10;
int main(int argc, char * argv[]) {
    @autoreleasepool {
        int b = 10;
        void (^blocktest)(int,int) = ^(int a,int b){
            a++;
            b++;
            NSLog(@"block a=%d,b=%d",a,b);
        };
        blocktest(a,b);
        NSLog(@"main a=%d,b=%d",a,b);
        return 0;
    }
}

打印结果

 block a=11,b=11

 main a=10,b=10

3.block 的作用域

      block可以使用和改变全局变量,而不能使用和改变局部变量,除非在局部变量前加__block修饰

 

int a = 10;
int main(int argc, char * argv[]) {
    @autoreleasepool {
        __block int b = 10;
        void (^blocktest)() = ^(){
            a++;
            b++;
            NSLog(@"a=%d,b=%d",a,b);
        };
        blocktest();
        NSLog(@"a=%d,b=%d",a,b);
        return 0;
    }
}

打印结果

a=11,b=11

 a=11,b=11

原文地址:https://www.cnblogs.com/mengdaxia117/p/5222757.html