美文网首页
OC中的static

OC中的static

作者: rogerwu1228 | 来源:发表于2017-11-30 01:09 被阅读386次

    1.局部变量中的static

    
    //局部变量
    //1.只会被初始化一次,也就是只有一份内存。
    //2.生命周期被改变,一直到程序结束才释放
    
    // age没有被static修饰的时候
    - (void)Aboutstatic
    {
        int age = 21;
        age--;
        NSLog(@"age==%d",age);
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //在此打印三次结果,看看输出
        [self Aboutstatic];
        [self Aboutstatic];
        [self Aboutstatic];
        
    }
    
    //控制台输出结果可以看到,变量age每次都被初始化为21,所以三次打印结果都为20
    2016-01-15 14:41:47.907 [1754:258152] age==20
    2016-01-15 14:41:47.908 [1754:258152] age==20
    2016-01-15 14:41:47.908 [1754:258152] age==20
    
    //age通过static修饰之后
    - (void)Aboutstatic
    {
        static int age = 21;
        age--;
        NSLog(@"age==%d",age);
    }
    //看看控制台输出结果
    2016-01-15 14:49:58.475 [1768:266933] age==20
    2016-01-15 14:49:58.476 [1768:266933] age==19
    2016-01-15 14:49:58.476 [1768:266933] age==18
    
    //第二次输出结果明显与第一次不一样,使用了static修饰之后,age的内存地址只有一份,只被初始化了一次,第一次初始化之后是21,21--之后第一次就输出了20,当第二次调用的时候,由于没有被重新初始化,自然就输出了19.
    复制代码
    
    

    2.全局变量中的static

    
    //全局变量
    /**
     1.默认情况没有被static修饰的情况下
     ①作用域是整个项目,项目中任何地方都能通过extern关键字来引用
     ②还是只会被初始化一次,内存地址同样只有一份
     */
    
    1.第一个类中声明一个全局变量和一个方法
    int age_ = 21;
    
    - (void)logAge
    {
        NSLog(@"age_==%d",age_);
    }
    
    2.在第二个类中使用extern来访问age_
        extern int age_;
        NSLog(@"%d",age_);
    看到控制台打印输出
    2016-01-15 15:26:50.224 [1810:289550] 21
    
    
    /**
     2.被static修饰的情况下
     ①作用域只限于当前文件,项目中任何地方都不能通过extern关键字来引用
     ②改变了作用域,但是没有改变生命周期
     */
    static int age_ = 21;
    当继续使用extern引用的时候,就会报错
    Undefined symbols for architecture x86_64:
      "_age_", referenced from:
          -[2eController viewDidLoad] in 2Controller.o
    错误是说在引用age_的时候,找不到这个变量,是因为使用了static修饰,所以除了第一个类自己除外,都访问不到
    复制代码
    

    相关文章

      网友评论

          本文标题:OC中的static

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