在iOS开发中随着项目工程的逐渐增大,过多的宏定义可能影响项目的编译速度。所以苹果推荐我们使用修饰符 const,尽量少使用宏定义; ##### 一、const与宏的区别 1、宏在编译开始之前就会被替换,而const是编译阶段; 2、宏可以定义一些函数方法,const不能; 3、宏编译时只替换不做检查不报错,也就是说有重复定义问题。而const会编译检查,会报错; ##### 二、const作用及使用场景 1、const 用来修饰右边的变量(eg:基本数据变量p,指针变量*p) 2、被 const 修饰的变量是只读的 指针类型根据位置的不同可以理解成3种情况: - 常量指针 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。 NSString \* const pt1; - 指向常量的指针 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改 const NSString \* pt2; - 指向常量的常量指针 const NSString \* const pt3; ##### 三、const与static、extern联合使用 ###### 1、static 与 const 作用:iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量 场景:在一个文件中经常使用的字符串常量,可以使用static与const组合 ``` static const int a = 20; // 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改 static NSString * const key = @"name"; // 如果 const修饰 *key1,表示*key1只读,key1还是能改变 static NSString const *key1 = @"name"; ``` ###### 2、 extern 与 const 场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。 原因:static与const组合,在每个文件都需要定义一份静态全局变量;而extern与const组合,只需要定义一份全局变量,多个文件共享。 写法:开发中便于管理所有的全局变量,通常搞一个GlobeConst文件,里面专门定义全局变量,统一管理,要不然项目文件多不好找。 ``` //GlobeConst.h extern NSString * const nameKey = @"name"; //GlobeConst.m NSString * const nameKey = @"name"; ``` ##### 四、那到底什么时候使用宏、const? 定义全局变量的时候,我们应该尽量先考虑使用 static 方式声名const来替代使用宏定义。const不能满足的情况再考虑使用宏定义。比如用以下定义: ``` static NSString * const CLASSNAMEconst = @"Hello"; static const CGFloat CLASSNAMEWidth = 10.0; ``` 代替: ``` #define CLASSNAMEDEFINE @"Hello" #define CLASSNAMEWIDTH 10.0 ``` 对于整型类型,代替宏定义直接定义整型常量比较好的办法是使用enum,使用enum时推荐使用NS_ENUM和NS_OPTIONS宏。比如用以下定义: ``` typedef NS_ENUM(NSInteger,TestEnum) { MY_INT_CONST = 12345 }; ``` 代替: ``` #define MY_INT_CONST 12345 ``` NS_OPTIONS定义方式如下: ``` typedef NS_OPTIONS(NSInteger, SelectType) { SelectA = 0, SelectB = 1 << 0, SelectC = 1 << 1, SelectD = 1 << 2 }; ```
Activity