一直以来对这三者的使用都不是十分的清晰,今天正好有机会整理一下,权当留着以后当笔记用
Const
const有两个作用:
1.const仅仅用来修饰右边的变量
2.被const修饰的变量只读,也就是只能获取,不能修改。
- (void)viewDidLoad {
[super viewDidLoad];
// 这两种写法是一样的,const只修饰右边的基本变量b
const int b = 20; // b:只读变量
int const b = 20; // b:只读变量
// 不允许修改值
b = 1;
##指向常量的指针;常用于银行报表,具有只读不可写的权限;
// const修饰指针变量 两种方式一样
const int *p1; // *p1:常量 p1:变量
int const *p1; // *p1:常量 p1:变量
##指向变量的常量指针;可以改变数据,但是不可以改变地址;
// const修饰指针变量p1
int * const p1; // *p1:变量 p1:常量
##指向常量的常量指针;数据和地址都是不可以改变的;
// 第一个const修饰*p1 第二个const修饰 p1
// 两种方式一样
const int * const p1; // *p1:常量 p1:常量
int const * const p1; // *p1:常量 p1:常量
}
const
的使用场景:
1.修饰全局只读变量,常用来代替宏
2.修饰方法中的参数
在开发中我们会将经常使用的常量用宏来保存,比如:
#define STWName @"STWName"
- (void)viewDidLoad {
[super viewDidLoad];
[XMGUserDefault setValue:@"gzp" forKey:STWName];
}
但是苹果其实是不推荐我们使用宏的,它更喜欢我们使用const
,所以在swift中宏已经被抛弃了,我们只能使用const
来代替宏
// 字符串常量
static NSString * const STWName = @"STWName";
- (void)viewDidLoad {
[super viewDidLoad];
[XMGUserDefault setValue:@"gzp" forKey:STWName];
}
const
和宏的一些使用区别:
编译时刻:宏是预编译(编译之前处理),const是编译阶段。
编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
宏的好处:宏能定义一些函数,方法。 const不能。
宏的坏处:使用大量宏,容易造成预编译时间过长
Static 和 Extern
static作用:
修饰局部变量:被static修饰的局部变量,可以延长生命周期,生命周期跟整个应用程序一致;被static修饰的局部变量,只会分配一次内存。
修饰全局变量:被static修饰的全局变量,作用域会被修改,只能在当前文件下使用;
extern作用: 用来声明外部全局变量;只能用于生明,不能用于定义变量;
extern工作原理:先会去当前文件下查找有没有对应全局变量,如果没有,才会去其他文件查找。
static与const联合使用
static,const结合使用的作用:声明一个只读的全局静态变量。
开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合
static NSString * const SWTName = @"SWTName";
[[NSUserDefaults standardUserDefaults] setObject:@"张三" forKey:SWTName];
extern与const联合使用
开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合.
为了避免重复报错,全局变量不能定义在自己的类中,我们需要自己创建一个全局文件用来统一管理全局的东西,创建一个全局类GlobelConst
:
GlobeConst.h
/*******************************首页****************************/
extern NSString * const nameKey;
/*******************************首页****************************/
GlobeConst.m
#import <Foundation/Foundation.h>
/*******************************首页****************************/
NSString * const nameKey = @"name";
/*******************************首页****************************/
参考链接: