Block使用总结

Block的使用

    int a = 10;
    NSLog(@"1-----------%d     %p",a,&a);
    void(^block)(void) = ^{
        NSLog(@"2-----------%d  %p",a,&a);
    };
    a = 20;
    block();
    NSLog(@"3-----------%d     %p",a,&a);

输出结果:

 

结论:

从输 出结果可以看出block内和block外是两个作用域,内部的指针a和外部的指针a虽然名字一样但他们的内存地址已经不同了,这也就是我们可以内部修改局部变量的原因。在block内部会将局部变量的指正复制一份,这样内部和外部就不是一个指针了,就算你重新给内部指针赋值,也无法改变外部指针的指向,他们只是名字相同。
  __block int a = 10;
    NSLog(@"1-----------%d     %p",a,&a);
    void(^block)(void) = ^{
        NSLog(@"2-----------%d  %p",a,&a);
    };
    a = 20;
    block();
    NSLog(@"3-----------%d     %p",a,&a);

输入结果

结论:

没有通过__block修饰则是将值传进去,而通过__block修饰之后是将变量的内存地址传进去,这样就可以修改变量的值。

static int a = 10;
    NSLog(@"1-----------%d     %p",a,&a);
    void(^block)(void) = ^{
        NSLog(@"2-----------%d  %p",a,&a);
        a = 30;
    };
    a = 20;
    block();
    NSLog(@"3-----------%d     %p",a,&a);

 输入结果:

结论:静态变量的内存地址一致,所以可以修改变量的值

_a = 10;
    NSLog(@"1-----------%d     %p",_a,&_a);
    void(^block)(void) = ^{
        NSLog(@"2-----------%d  %p",_a,&_a);
    };
    _a = 20;
    block();
    NSLog(@"3-----------%d     %p",_a,&_a);

 输出结果

结论:全局变量的内存地址一致,所以可以修改变量值

总结:1.如果block访问的外部变量是局部变量,那么就是值传递,外界改了,不会影响里面
     2.如果block访问的外部变量是__block或者static修饰,或者全局变量,那么就是指针传递,block里面的值和外界属于同一变量,外界改变,里面也会改变 

Block的注意事项 

猜你喜欢

转载自www.cnblogs.com/hualuoshuijia/p/11403779.html
今日推荐