引言
在使用常量字符串的时候,主要有两种写法:
define RKLICURegexEnumerationOptionsErrorKey @”RKLICURegexEnumerationOptionsErrorKey”
extern NSString * const RKLICURegexEnumerationOptionsErrorKey;
这两种写法孰优孰劣?或者在哪些情况下该用那种写法?
1、#define
通过宏定义的方式定义的字符串常量,我们通常会认为是进行了替换掉动作。但是,实际上,@""
写法的字符串会在编译期被替换成NSConstantString的实例,NSString也是唯一一种可以在编译期被实例化的类。
所以,使用#define(相当于使用@””
写法的“字面量”)不能在shared libraries的情况下保证得到的字符串地址是一样的。所以在shared libraries的情况下, 如果用@””
的字符串作为dictionary的key的话,会导致它需要做isEqualToString的比较,如果用extern NSString * const,只要做指针的比较。显然指针比较比逐个字符比较快多了。
2、extern NSString * const
const
const最好理解,修饰的东西不能被修改
指针类型根据位置的不同可以理解成3种情况:
常量指针
// 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。
NSString * const pt1;
指向常量的指针
// 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改
const NSString * pt2;
指向常量的常量指针
const NSString * const pt3;
extern
等同于c,全局变量的定义,
// .h 声明
extern const NSString * AA;
// .m 定义
const NSString * AA = @”abc”;
// 调用
通过#import “ .h”引用
或者再次申明
extern const NSString * AA;
结论
根据上面的这些内容,我们可以简单下一个结论,在iOS开发中,为了防止出现通过静态库之类的方式在调用常量字符串出现的问题,我们可以简单的,通过extern NSString *const的方式来实现我们的常量字符串。
本作品采用 署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5)协议
进行许可,欢迎转载,但转载请注明来自SarielTang
,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文永久链接:http://sarieltang.github.io/2016/05/18/知识点小结/2016-05-18/index/