在程序中我们会经常的遇到一些常量是经常使用的,我们通常将他们定义成枚举类型 或 宏定义类型 再或是const常量
1.宏定义(苹果不推荐,在swift中已被抛弃,推荐使用const)
宏定义属于预编译指令,在程序运行之前已经编译好了的,比如下面:
#define DeviceId @"deviceid"
如果在程序中有用到DeviceId的,那么会在程序运行之前将所有的DeviceId替换成@"deviceid",每次替换相当于开辟了一块临时的内存空间。显然这样是浪费的。
既然推荐使用const,那它和宏有啥区别,为什么推荐?
1.编译时刻 宏:预编译 const:编译
2.编译检查 宏没有编译检查,不会报编译错误,只是替换;const有编译检查,会报编译错误
3.宏的好处 宏能定义一些函数,方法,但是const不可以
4.宏的坏处 大量使用宏,会导致预编译时间过长。
5.宏会占用更多的内存空间,const不会
const有两个作用:
1.修饰右边的基本变量和指针变量;
2.被const修饰的变量只读,也就是只能获取,不能修改。
const的使用场景:
1.修饰全局变量 ==>全局只读变量 ==> 代替宏
2.修饰方法中的参数
2. extern和const组合定义(定义全局只读变量,多个文件经常使用同一个字符串常量)
~~~~extern修饰的全局变量默认是有外部链接的,作用域是整个工程
1.可以定义一个全局常量管理的类,GlobalConfig在.h中先声明如下:
extern NSString * const kAppDidVideoTimeOutNotification;
如果参照苹果的写法就是
UIKIT_EXTERN NSString * const kAppDidVideoTimeOutNotification;
2.在.m中实现如下:
@implementation GlobalConfig
NSString * const kAppDidVideoTimeOutNotification = @"kAppDidVideoTimeOutNotification";
接下来就把该头文件导入pch里面,全局就可以使用了
3.static和const组合定义
1.static的作用
(1)修饰局部变量:被static修饰的局部变量,可以延长生命周期,生命周期跟整个应用程序一致;被static修饰的局部变量,只会分配一次内存。
(2)修饰全局变量:被static修饰的全局变量,作用域会修改,生命周期不会改,只能在当前文件下使用。
static将一个全局变量变成局部变量
const将一个局部变量变成局部常量
// 定义了一个局部常量
static const NSString *str = @"123";