• extern字符串常量,宏定义字符串常量,怎么选


    在使用常量的时候,我看到主要有两种写法:

    #define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOptionsErrorKey"
    extern NSString * const RKLICURegexEnumerationOptionsErrorKey;
    

    这两种写法孰优孰劣?或者在哪些情况下该用那种写法?

    看了一下stackoverflow的几个答案:

    http://stackoverflow.com/questions/25746/whats-the-difference-between-a-string-constant-and-a-string-literal

    http://stackoverflow.com/questions/538996/constants-in-objective-c

    大致是这样的:

    使用#define(相当于使用@""写法的“字面量”)不能在shared libraries的情况下保证得到的字符串地址是一样的。String Programming Guide中也有描述 "The compiler makes such object constants unique on a per-module basis, and they’re never deallocated."可见使用@""的写法是在编译期就把字符串实例已经生成好的。

    @""写法的字符串会在编译期被替换成NSConstantString的实例,NSString也是唯一一种可以在编译期被实例化的类。

    所以在shared libraries的情况下, 如果用@""的字符串作为dictionary的key的话,会导致它需要做isEqualToString的比较,如果用extern NSString * const,只要做指针的比较。显然指针比较比逐个字符比较快多了。

    所以如果需要作为dictionary的key的话,使用extern NSString * const的写法,要比@""的写法(也就是用#define)更好。

    转:http://segmentfault.com/q/1010000000193333

  • 相关阅读:
    RIGHT JOIN 关键字
    LEFT JOIN 关键字
    INNER JOIN 关键字
    连接(JOIN)
    别名
    BETWEEN 操作符
    IN 操作符
    通配符
    LIKE 操作符
    LIMIT 子句
  • 原文地址:https://www.cnblogs.com/ygm900/p/4572792.html
Copyright © 2020-2023  润新知