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是可以被修改。

如果要定义个静态常量可以这样定义
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";
网友评论