如何使用const修饰常量

在程序中我们会经常的遇到一些常量是经常使用的,我们通常将他们定义成枚举类型 或 宏定义类型 再或是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";

你可能感兴趣的:(如何使用const修饰常量)