美文网首页
iOS【const static extern 】

iOS【const static extern 】

作者: NJ_墨 | 来源:发表于2020-05-28 21:50 被阅读0次

    摘录:博主「MIKE-zi」
    很多字符串我们都定义成宏,但是苹果推荐的是使用const。

    区别:

    1、编译时刻:const是编译阶段,define是预编译阶段
    2、编译检查:由于宏是预编译阶段处理,宏不做检查,只是单纯的替换。 const是会编译检查, 可以报编译错误。
    3、宏的优势:可以定义函数,方法。const不行
    4、宏的劣势:大量宏,会造成编译时间久,每次都需要重新替换。

        int a = 10;           //&a:0x00007ffee741e008
        int b = 30;           //&b:0x00007ffee741e004
          
        int *const p = &a;    //p:0x00007ffee741e008
        int const  *p1 = &a;  //p1:0x00007ffee741e008  *p1:10
               
        *p = 20;              //a:20   *p1:20
        p1 = &b;              //p1:0x00007ffee741e004  *p1:30
    

    如果const修饰的是p,那么p的值是不能改变的,也就是p中存放的a的地址无法改变(p是int类型的指针变量)。
    但是*p是可以变化的,我们并没有用const去修饰*p,所以可以通过*p去改变a的值

    如果const修饰的是*p1,那么*p1的值是不能改变的,也就是p1中存放的a的地址中的值无法改变,但是p1的值是可以改变的(也就是p1此时可以改变指向)

    static修饰局部变量:

    1、延长局部变量的生命周期,程序结束才会销毁。
    2、局部变量只会生成一份内存,只会初始化一次。
    3、改变局部变量的作用域。

    static修饰全局变量

    1、只能在本文件中访问,修改全局变量的作用域,生命周期不会改
    2、避免重复定义全局变量

    类中用static定义一个局部变量,每次执行这个static内存做了哪些事(从内存空间的角度)
    -(void)method3:(NSMutableString *)str
    {
        static int n = 1;
    //    static等价语句
    //    if (变量n没有存储空间)
    //    {
    //        给n分配存储空间
    //    }
        [str appendFormat:@"%d ", n];
        n++;
        
        g1 = 400;
    }
    

    如同注释,将Int n 从栈区拿到全局区,延长n的生命周期到程序结束。
    如果多次调用method3方法。
    都会判断是否已经初始化了n,如果没有初始化,开辟内存空间,如果已经分配了,就把全局区的n,拿过来继续使用

    // static修饰全局变量
    static int age = 10;
    - (void)test
    {
        // static修饰局部变量
        static int age = 0;
        age++;
        NSLog(@"%d",age);
    }
    - (void)viewDidLoad {
        [super viewDidLoad];   
        [self test];
        [self test];
        
        extern int age;
        NSLog(@"%d",age);
    }
    

    输出结果: 1 , 2 ,10
    test里面是局部变量age
    static的修饰只是延长了局部变量的生命周期。从栈区拿到了全局区。
    所以第一次输出1,第二次输出2,每次+1。
    最后一个行输出考察了extern,其实就是获取本文件的全局变量,这里全局变量定义了10,就输出10,而没有输出局部变量2.

    A.h中
    static int age = 10;
    A.m中
    const NSString *HSCoder = @"hello word";
    
    B.m中
    extern NSString *HSCoder;
    NSLog(@"%@",HSCoder);//hello word
    
    extern int age;//不写也可以
    NSLog(@"-----%d",age);//10
    
    
    C.m中
    NSString  *const nameKey = @"name"
    C.h中
    extern NSString * const nameKey;
    
    D.m中
     NSLog(@"%@",nameKey);//name
    

    答案是都可以。这就是extern的用法

    `修饰全局的`。不改变生命周期,单纯的修改作用域。让这个常量只能在`当前.m使用`
     static const NSString *HSCoder = @"hello word";
    

    extern作用:
    只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
    extern工作原理:
    先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。

    相关文章

      网友评论

          本文标题:iOS【const static extern 】

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