[Objective-C] 创建常量
#define
宏定义
#define
是一条预编译指令, 编译器在编译阶段前期会将所有使用到宏的地方简单地进行替换.
在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
但#define
可以使用类型定义,比如
#define MY_INT_CONSTANT ((int)123)
const
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
如果在一个指定单一类里声明常量,在.m 文件顶端用 static const 声明
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果常量属于一个类,但又要其他类可以访问,在头文件将其声明为 extern ,在.m文件定义
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们是全局的常量,在头文件声明,并在相应模块里定义。
enum
enum拥有define和const两者的优点,不过enum只能定义整型常量。
如何选择
尽量选择使用const,因为编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。
相反,define占据更多的内存空间,因为它只是文字替换,导致存在过多的拷贝。当然这一点是对于一般类型的常量来说的。对于int型常量,引用const的地方拿到的是内存地址,地址数据和int差不多,所以内存上应该不会有太大区别。
另外,const对编译器和调试器来说更加友好。这一点可以作为一个很重要的参考。
记录比较粗略,只是简单整理一下网友讨论,这里用到的具体的语法还是要自己去研究,比如const *int 和 int *const的区别等。
#define vs const in Objective-C
What is the best way to create constants in Objective-C