block 从浅到深(二)

作者: 比沉默寡言话多 | 来源:发表于2016-07-31 13:40 被阅读181次

    关于各种变量在block中的作用域.

    //请先稍微大致浏览一下,早就懂的和老鸟请翻页.

    void(^myBlock)(void);
    
    int a =20;
    
    myBlock = ^{
    
    intb =20;
    
    NSLog(@"%d", a); //这句话正常打印 说明block内能读取到block外的变量
    
    NSLog(@"%d", b++); //连续两遍的打印结果都是 20;说明局部变量出了block就会销毁
    
    // NSLog(@"%d", a++);  //这句话会报错, 理由是变量a不可修改  xcode建议修改成 __block int a;
    
    };
    
    //NSLog(@"%d", b);  //这句话会报错,说明block外读取不到bolck内部的变量
    
    myBlock();
    
    myBlock();//连续调用两次
    

    先写了这么一段代码 这段代码我都再注释里解释了,如果有不清楚的,自己复制出去运行一下.

    然后对这段代码进行了修改 同时由于oc最终都是用来写ios的,所以我引进来了一个label.声明为属性 并初始化

    void(^myBlock)(void);
    
    __block int a =3;
    
    myBlock = ^{
    
    self.label.text=@"world";  //发现声明的属性可以在block内进行修改
    
    a =4;   //而声明的变量要想修改必须在前面加一个__block  这里是两个下划线 .
    
    static int b =3;  //这里将变量声明周期延长
    
    NSLog(@"%d", b++);  //两次打印的结果 第一次为3 第二次为4  说明延长生命周期以后,第二次打印的b用的是第一次加1以后的值,而方法声明部分显然就不会再执行.
    
    };
    
    myBlock();
    
    myBlock();
    

    最后引进一个问题

    void(^myBlock)(void);
         int a = 3;  //第二种 __block int a = 3;//第三种 static int a = 3;
        myBlock = ^{
            NSLog(@"%d", a); //为什么第一种打印结果是3 ? 为什么第二种打印结果是4? //第三种也是4?    
    //ps :后两种都可以进行值的修改
        };
        a = 4;
        myBlock();
    

    这个会在后面的关于block原理的文章中讲

    相关文章

      网友评论

        本文标题:block 从浅到深(二)

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