iOS中const,static,extern区别

2020-03-14  本文已影响0人  MiniCoder

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

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

 NSString  * const constKey = @"constKey";

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

static  NSString  * const constKey = @"constKey";

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

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

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

-(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 修饰的局部变量作用域只在本函数,但是生命周期类似全局变量。

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

 NSString  * const cconstKey = @"constKey";

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

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

总结:

extern

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

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

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

猜你喜欢

热点阅读