const和#define都可以用来定义常量
const:用来定义一个常量, 其实在 C++中,const 修饰的常量能不能修改,还是需要看const指向常量还是指向常量的指针,在这里就不深入了,感兴趣的朋友可以在网上看看 C++中 const 的用法。const 命名遵循驼峰命名规则,如果仅在当前编译单元里面,则以小写 k开头;若在类之外调用,则以类名为前缀。
const 常量用 static 修饰意味着改常量仅在定义此变量的.m 文件中可见;如果不加 static,编译器会为它创建一个外部符号,此时,如果另一个文件中也声明了同名常量,就会报错。
如果 const 常量在其他的类中也需要用到,那么就需要放在全局符号表(global symbol table)中 了。
// .h 文件
extern NSString *const ClassName_ConstantName;
// .m 文件
NSString *const ClassName_ConstantName = @"name";
编译器看到头文件中的extern关键字,就能明白如何在引入此头文件的代码中处理该常量了,这个关键字是要告诉编译器,在全局符号表中将会有一个名叫ClassName_ConstantName的符号;编译器无需查看其定义。
define, 定义常量, 是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换.
区别:
define不指定类型,const指定类型
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝,
宏能做到const不能办到的事.
1、宏能定义函数
2、OC的单例模式用到宏
3、宏还能根据传入的参数生成字符串
4、宏定义的常量可以被重写