iOS字符串常量的使用

目录
  1. 1. 引言
    1. 1.1. 1、#define
    2. 1.2. 2、extern NSString * const
      1. 1.2.1. const
      2. 1.2.2. extern
  2. 2. 结论

引言

在使用常量字符串的时候,主要有两种写法:

  1. define RKLICURegexEnumerationOptionsErrorKey @”RKLICURegexEnumerationOptionsErrorKey”

  2. 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种情况:

  1. 常量指针

    // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。

    NSString * const pt1;

  2. 指向常量的指针

    // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改
    const NSString * pt2;

  3. 指向常量的常量指针

    const NSString * const pt3;

extern

等同于c,全局变量的定义,

  1. // .h 声明

    extern const NSString * AA;

  2. // .m 定义

    const NSString * AA = @”abc”;

  3. // 调用

    通过#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/