美文网首页
iOS中const,static,extern区别

iOS中const,static,extern区别

作者: MiniCoder | 来源:发表于2020-03-14 14:38 被阅读0次

    const

    • const用来修饰右边的基本变量或指针变量
    • 被const修饰的变量是只读的。
    
         int const a = 0;
         const int b = 10;
    
    

    这两行代码的意思一样,我们在查看修饰某个变量的时候,可以将类型先去掉
    那么这两行代码看起来就是 const a,const b .表示常量 a,b不能被修改
    同理我们看下面的代码

       int const * c = &a;
       const int * d = &a;
    

    这两行代码表示 *c和*d是常量不能被修改,但是c和d是可以被修改。

    截屏2020-03-1413.59.47.png

    如果要定义个静态常量可以这样定义

    static NSString  * const constKey = @"constKey";
    

    static

    • 当static关键字修饰全局变量时,作用域仅限于当前文件,外部类是不可以访问到该全局变量的。

    在不同的文件中如果我们定义一个全局变量

     NSString  * const constKey = @"constKey";
    

    在编译的时候就会报错,不能重复定义。
    如果我们定需要定义相同的全局,可以这样定义

    static  NSString  * const constKey = @"constKey";
    

    这样就不会报错。
    网上有看到资料说

    默认情况下,全局变量在整个程序中是可以被访问的(即全局变量的作用域是整个项目文件

    但是测试发现,在不同文件中定义相同的全局变量会报重复定义的错误,但是不同文件中也访问不到其他文件的全局变量,不知道为什么会这么说(全局变量在整个程序中是可以被访问的)。

    • 当static关键字修饰局部变量时,在程序中只有一份内存。
      下面做一个测试,在Man类中实现两个方法。
    -(void)test{
    
        static int i = 0;
        i++;
        NSLog(@"%d %s %p",i,__FUNCTION__,self);
    }
    -(void)test1{
        static int i = 0;
        i++;
        NSLog(@"%d %s %p",i,__FUNCTION__,self);
    }
    
    

    下面打印测试

            Man * man = [Man new];
            Man * man1 = [Man new];
            [man test];
            [man test1];
            
            [man1 test];
            [man1 test1];
    
    [10335:569453] 1 -[Man test] 0x1031664e0
    [10335:569453] 1 -[Man test1] 0x1031664e0
    [10335:569453] 2 -[Man test] 0x1031672d0
    [10335:569453] 2 -[Man test1] 0x1031672d0
    

    同一个类创建的不同对象,调用同一个方法时,static 修饰的变量也是唯一存在的。
    static 修饰的局部变量作用域只在本函数,但是生命周期类似全局变量。

    • static关键字可延长局部变量的生命周期,直到程序结束才销毁。

    在.h文件中声明全局变量会报错,

     NSString  * const cconstKey = @"constKey";
    

    但是加上static 以后不会报错,而且外部也可以访问到。
    如果在其他文件中重复定义,编译不会报错,但是如果将两个类导入到另一个相同文件,会报错重复定义。

    • 在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

    C语言中使用静态函数的好处:
    静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
    关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系

    总结:

    • 局部变量存储在栈里面 系统会自动释放,加上static以后,局部变量就被定义成为一个局部静态变量,存储在静态存储区。
    • 全局变量存储在静态区中 程序启动时就会分配存储空间 直到程序结束才会释放
    • 现在可以肯定的是,static 修饰局部变量的时候不会改变作用域,且在内存中只有一份。
    • static修饰全局变量的时候有疑问:
      在.m文件中声明的全局变量加不加static,外部都不能访问到.不加static但是重复定义会报编译错误,加上static重复定义不会报错,那么static 将这个变量只作用于当前文件。
      在.h中声明全局变量不加static 会报错,加上static 不会报错,不同文件重复定义也不会报错,但是如果将两个类导入到另一个相同文件,会报错重复定义。

    extern

    开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。
    原因: 如果是static与const组合:那么在每个文件都需要定义一份静态全局变量。而用extern与const组合:只需要定义一份全局变量,多个文件共享。

    全局常量正规写法:开发中便于管理所有的全局变量,通常搞一个文件来定义,里面专门定义全局变量,统一管理,要不然项目文件多不好找。

    在.h中声明
    extern NSString * const nameKey ;
    在.m中
    NSString * const nameKey = @"name";
    

    相关文章

      网友评论

          本文标题:iOS中const,static,extern区别

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