美文网首页
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