-
const
,static
,extern
几个关键字,在它们的概念和用法上一直有点模糊,整理一下, 以便日后查阅。
1、const
- 作用
1、
const
仅仅用来修饰它右侧的变量
2、 被const
修饰的变量是只读的
注: 这就是为什么推荐使用const来替代宏定义, 宏定义不会报错, 并且是可变的
- 常量区分和简单使用
// 定义一个全局只读常量。全局常量:不管你定义在任何文件夹,外部都能访问
1、#import"ViewControllerOne.h"
NSString *const tempString = @"Eugene_iOS";(同const NSString * tempStr = @"Eugene";)
2、#import"ViewControllerTwo.h"
extern NSString * globalStr ;
NSLog(@"==%@==", globalStr);
// 定义一个局部只读常量。局部常量:用static修饰后,只能本文件访问,不能提供外界访问
static NSString *const Key = @"Eugene_iOS”;
- (void)viewDidLoad {
[super viewDidLoad];
//这里修改会报错,tempString不能被修改
tempString = @"test";
}
- const修饰位置不同
// const:修饰基本变量
const int b = 20; // b:只读变量
int const b = 20; // b:只读变量
// 不允许修改值
b = 1;
//由此可见无论const在int的哪一边,a和b都是只读变量.
// const:修饰指针变量
int * const p1; // *p1:变量 p1:常量
const int *p1; // *p1:常量 p1:变量
int const *p1; // *p1:常量 p1:变量
const int * const p1; // *p1:常量 p1:常量
int const * const p1; // *p1:常量 p1:常量
补充 (const和define区别)
const
为常量值,define
为字符串替换。
-
const
在编译阶段使用;define
在预编译阶段使用。 -
const
有数据类型,做安全检查;define
无类型,不做安全检查。 -
const
可以调试;define
不能调试。 -
const
占用一份内存;define
不占用内存,但是会多处进行字符串替换
以上几点可概括为:
宏
:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。
常量
:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查。
变量
:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查。
宏的好处
: 宏能定义一些函数、方法。 const不能。
宏的坏处
: 使用大量宏,容易造成编译时间久,每次都需要重新替换。
参考资料
2、static和extern使用
static作用
- 修饰局部变量:
1.延长局部变量的生命周期, 程序结束才会销毁。
2.局部变量只会生成一份内存, 只会初始化一次。
3.改变局部变量的作用域。(默认情况下全局变量的作用域是整个程序->可以通过extern来引用
, 被static修饰后仅限于当前文件来引用, 其他文件不能通过extern来引用) - 修饰全局变量
1.只能在本文件中访问, 修改全局变量的作用域,生命周期不会改
2.避免重复定义全局变量
extern作用
- 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
extern工作原理
- 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
-
简单举例
-
全局变量
-
-
在全局变量前面添加Static关键字后
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;
// static修饰全局变量
static int age = 20;
- (void)test {
// static修饰局部变量
static int age = 0;
age++;
NSLog(@"%d",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test];
[self test];
extern int age;
NSLog(@"%d",age);
}