ios - extern字符串常量,宏定义字符串常量,怎么选
黄舟
黄舟 2017-04-17 11:37:27
[iOS讨论组]

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

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

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
大家讲道理

看了一下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)更好。

大家讲道理

define只是简单的替换,又称作宏定义、预处理命令。

而const是要分配内存空间的,提示编译器遇到此变量和函数时在其他模块中寻找其定义

还有就是#define是不会对数据类型进行检查的,而第二种会对数据类型进行安全检查、

推荐可以看看这篇文章,对Define与Const分析的比较详细,自己拿捏!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号