美文网首页
static关键字的作用是什么?

static关键字的作用是什么?

作者: 凌云01 | 来源:发表于2020-08-28 23:02 被阅读0次

    我们开发常看到static关键字修饰变量,那么当变量被static关键字修饰的时候,会有什么变化呢?

    static修饰局部变量

     - (void)staticTest {
        
        NSInteger i = 0;
        i++;
        
        static NSInteger n = 1;
        n++;
        
        NSLog(@"i = %ld, n = %ld", (long)i, (long)n);
        NSLog(@"i地址: %p, n地址: %p", &i, &n);
    
    
    }
    
    

    将上述方法执行三次后,打印结果如下:

    i = 1, m = 2
    i地址: 0x7ffee6575138, n地址: 0x10968d508
    i = 1, m = 3
    i地址: 0x7ffee6574f78, n地址: 0x10968d508
    

    i是一个局部变量,而n是一个用static修饰过的局部变量。每次调用staticTest方法的时候,i都是重新初始化,且打印的结果都是1,其内存地址也会发生变化。而用static修饰了的局部变量n却完全不同了,n只会初始化一次,且最终的打印结果是3,其内存地址也不会发生变化。

    当用static修饰局部变量的时候,该局部变量只能初始化一次,在内存中的地址不变,并随着程序的结束而销毁掉(延长了局部变量的生命周期)。

    static修饰全局变量

    #import "ClassA.h"
    
    // 声明一个全局变量
    NSInteger num1;
    static NSInteger num2;
    
    @implementation ClassA
    
    @end
    
    #import "ClassB.h"
    
    // 声明一个全局变量
    NSInteger num1;
    static NSInteger num2;
    
    @implementation ClassA
    
    @end
    

    在两个类中定义两个相同的全局变量,num1是普通的全局变量,num2是被static修饰过的全局变量,当我们运行的时候会报错。

    报错原因:num1全局变量重复定义,而用static修饰过的num2不会报这个错,这主要就是因为我们用static对num2进行了修饰,让它作用域只限在本类中,外部类无法访问该变量。

    对于静态全局变量,如果该变量定义在.h文件中,那么外部类导入该.h文件, 仍然可以访问该全局变量,但也能创建一个同名的变量,且同名的变量有效。

    static修饰全局变量之后,可让该全局变量的作用域只在本类中。

    extern关键字

    我们可以使用extern来访问全局变量。

       extern NSInteger num1;
        NSLog(@"%ld", num1);
        num1 = 10;
        NSLog(@"%ld", num1);
    

    打印结果:1,10
    我们在某个类中即时没有引入定义全局变量var1的文件也能访问该全局变量。

    OC中的类方法类似于C中的static函数,在全局中只有一份。

    相关文章

      网友评论

          本文标题:static关键字的作用是什么?

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