美文网首页
block特性:截取自动变量值

block特性:截取自动变量值

作者: 有一种再见叫青春 | 来源:发表于2016-11-16 11:06 被阅读40次

    blcok是带有自动变量值的匿名函数."带有自动变量值"在block中表现为"截取自动变量值".实例如下
    <pre>
    int main ()
    {
    int dmy = 256;
    int val = 10;
    const char *fmt = "val = %d\n";
    void (^blk)(void) = ^ {printf(fmt, val);};
    var = 2;
    fmt = "These values were changed. val = %d\n";
    blk();

    return 0;
    }
    </pre>
      Blcok语法的表达式使用的是它之前声明的自动变量fmt和val.Block中.Block表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值.因为Block表达式保存了自动变量的值,所以执行Blcok语法后,即使改写Blocck中使用的自动变量的值也不会影响Block执行时自动变量的值 所以执行结果 Val= 10

    __block说明符

    实际上,自动变量值截获只能保存执行Blcok语法瞬间的值.保存后就不能改写该值.若想在block语法表达式中将值赋给Blcok语法外声明的自动变量,需要在该自动变量上附加__block说明符.例子如下

    <pre>
    __block int var= 0;
    void (^blk) (void ) = ^ {var = 1;};
    blk ( );
    </pre>

    截获OC 对象,调用变更对象的方法也会产生错误吗?

    <pre>id array = [NSMUtableArray alloc]init; void (^blk)(void) = ^{ id obj = [NSOBject alloc]init; [array addObject:obj]; }</pre>
    这是没有问题的,而向截获的变量array赋值会产生错误.虽然赋值给截获变量array的操作会产生编译错误,但使用截获的值却不会有任何问题.这种情况下,需要给截获的自动变量附加__block 说明符

    <pre>
    __blcok id Array= [NSMutableArray alloc]init;
    void (^blk)(void) = ^ {

    Array = [NSMutableArray alloc]init;
    };

    </pre>

    相关文章

      网友评论

          本文标题: block特性:截取自动变量值

          本文链接:https://www.haomeiwen.com/subject/sjtrpttx.html