zoukankan      html  css  js  c++  java
  • 经验之谈—让你看明确block

    • 事实上我感觉不常常使用block的朋友。对block应该是比較陌生的,那么如今我们来扒开block的真面目,看看block的本质

    普通的局部变量。block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变

    void test()
    {
        int age = 10;
        void (^block)() = ^{
            // 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变
            NSLog(@"----age=%d", age);
        };
    
        age = 20;
    
        block();
    }

    这里的结果是10;事实上在编译的时候,是相当于这种:

    void test2()
    {
        int age = 10;
        void (^block)() = ^{
            // 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变
            NSLog(@"----age=%d", 10);
        };
    
        age = 20;
    
        block();
    }

    这里的这个值 是死的。

    所以不管你后面把age改成多少。block都不关心。换句话说:这里的age是局部变量,出了大括号就死了。所以直接把这个10拿过来,比較安全


    我们看一下。被block引用的变量的情况:
    block内部可以一直引用被__block修饰的变量

    void test3()
    {
        __block int age = 10;
        void (^block)() = ^{
            // block内部可以一直引用被__block修饰的变量
    
            NSLog(@"----age=%d", age);
        };
    
        age = 20;
    
        block();
    }

    这里:block能一直监听着这个age的值的改变(不管是局部变量还是全局变量),所以这里打印出来的是age是20
    __block修饰的变量,就能保住这个变量的命


    这里我们来看一下。被static修饰的变量。是静态变量,静态是永远在内存中。所以block看到static修饰的这个变量是永远存在内存中的。那么block就能每次都能拿到这个变量,所以你age的值的改变。block都能拿到。所以这是动态訪问的,不是把10直接拿过来

    void test4()
    {
        static int age = 10;
        void (^block)() = ^{
            // block内部可以一直引用被static修饰的变量
            NSLog(@"----age=%d", age);
        };
    
        age = 20;
    
        block();
    }

    int num = 10;
    void test5()
    {
        void (^block)() = ^{
            // block内部可以一直引用全局变量
            NSLog(@"----num=%d", num);
        };
    
        num = 20;
    
        block();
    }

    这里打印出来的num 是20 。

    为什么呢?
    由于这里的num是全局变量。那么既然是全局变量,就一直在内存中,block就能实时跟新这个值的改变。


    总结,那么我们如今推断的时候,我们仅仅须要推断这个变量是不是立即就销毁了即可了。可是注意一下__block修饰的变量即可

  • 相关阅读:
    2020重新出发,NOSQL,MongoDB分布式集群架构
    2020重新出发,NOSQL,MongoDB的操作和索引
    2020重新出发,NOSQL,MongoDB是什么?
    2020重新出发,NOSQL,redis高并发系统的分析和设计
    2020重新出发,NOSQL,redis互联网架构分析
    2020重新出发,NOSQL,Redis和数据库结合
    2020重新出发,NOSQL,Redis主从复制
    collections模块
    常用模块
    python面向对象的内置函数和反射
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6977753.html
Copyright © 2011-2022 走看看