最好在Objective C中使用#define或extern NSString * const

时间:2013-08-25 14:56:57

标签: iphone ios objective-c ipad

我的项目中有一些字符串,我想将所有字符串放在一个常见的文件中,表示常量。

(第一种方法) 在constants.h中,我可以这样做:

    #define COMMON_STRING @"myString"

OR

(第二种方法)

在constants.h中

    extern NSString *const COMMON_STRING;

在constants.m

    NSString *const COMMON_STRING = @"myString";

哪种方法更好用,为什么?或者我们还有其他更好的方法吗?

编辑:

根据那个帖子extern NSString * const COMMON_STRING;在记忆角度方面更好。但在某些地方我还读到#define会将字符串插入所有出现的内容,除非编译器优化相同的常量字符串出现,否则将内存使用量相乘 - 这就是情况。那么不使用#define是否有意义?

在建议的帖子中,一个帖子只定义了结构,另一个帖子解释了比较但非常有限而不是我期待的。如果编译器优化相同的常量字符串出现,那么为什么要使用extern NSString * const COMMON_STRING而不是#define COMMON_STRING?

1 个答案:

答案 0 :(得分:2)

一般来说:

static const

它尊重范围,并且是类型安全的。

我能看到的唯一限制是,如果你想在命令行上定义变量。

但还有另一种选择:

#ifdef VAR // Very bad name, not long enough, too general, etc..
static int const var = VAR;
#else
static int const var = 5; // default value
#endif

尽可能使用类型安全的替代方法而不是宏/省略号。

如果你真的需要使用宏(例如,你想要 FILE LINE ),那么你最好小心地命名你的宏因为它的宏命名约定Boost推荐所有大写字母,从项目名称(此处为BOOST_)开始,在使用库时,您会注意到(通常)后面跟着特定区域(库)的名称,然后是一个有意义的名称。