在使用常量的时候,我看到主要有两种写法:
#define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOptionsErrorKey"
extern NSString * const RKLICURegexEnumerationOptionsErrorKey;
这两种写法孰优孰劣?或者在哪些情况下该用那种写法?
在使用常量的时候,我看到主要有两种写法:
#define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOptionsErrorKey"
extern NSString * const RKLICURegexEnumerationOptionsErrorKey;
这两种写法孰优孰劣?或者在哪些情况下该用那种写法?
define只是简单的替换,又称作宏定义、预处理命令。
而const是要分配内存空间的,提示编译器遇到此变量和函数时在其他模块中寻找其定义
还有就是#define是不会对数据类型进行检查的,而第二种会对数据类型进行安全检查、
推荐可以看看这篇文章,对Define与Const分析的比较详细,自己拿捏!
2 回答1.7k 阅读
1 回答1k 阅读
844 阅读
1 回答649 阅读
787 阅读
598 阅读
565 阅读
看了一下stackoverflow的几个答案:
大致是这样的:
使用#define(相当于使用@""写法的“字面量”)不能在shared libraries的情况下保证得到的字符串地址是一样的。String Programming Guide中也有描述 "The compiler makes such object constants unique on a per-module basis, and they’re never deallocated."可见使用@""的写法是在编译期就把字符串实例已经生成好的。
所以在shared libraries的情况下, 如果用@""的字符串作为dictionary的key的话,会导致它需要做isEqualToString的比较,如果用extern NSString * const,只要做指针的比较。显然指针比较比逐个字符比较快多了。
所以如果需要作为dictionary的key的话,使用extern NSString * const的写法,要比@""的写法(也就是用#define)更好。