Objective-C:#define vs extern const

我知道这个问题之前已经被问过了,但是我似乎无法在苹果的文档中find关于它的信息。 也许你们中的一些人做到了。

很多Objective-C代码在.h文件中使用#define具有跨文件常量。 其他人使用常量的.m方法,并在.h文件中使用extern

我明白了区别,正反两方面,但是苹果在iOS开发中使用哪一个呢?

苹果的build议是extern

定义用于通知名称和字典密钥等用途的string常量。 通过使用string常量,您可以确保编译器validation是否指定了正确的值(即执行拼写检查)。

诚然,他们有时会不一致。

在extern上使用#define的麻烦是编译器不能进行任何types的检查。 如果你定义了一个string,没有什么可以阻止你在你想要的地方使用它,比如说一个数字。 如果您使用静态NSString,编译器会发出警告,如果您尝试在不期待string的地方使用它。

#define定义了一个在编译开始之前被replace的macros,因为extern *** *const只是修改了一个variables,所以编译器会在你尝试修改的时候标记错误。 有些情况下你会使用#define因为你不能使用extern *** *const 。 从理论上讲, extern *** *const会占用内存,并且需要对内存的引用,但是这是不重要的,因为它可能会远离编译器进行优化。

extern *** *const s是更多的编译器和debugging友好的然后#define s这可以是决定点,当你决定使用哪一个。

有些人认为像#define这样的预处理器指令是不好的,因此build议你应该使用extern *** *const over #define

但是,虽然预处理器皱起了眉头,但有人说它是更安全的,然后一个variables,因为它不能在运行时改变,而variables可以。

两者都有优点和缺点,我不认为(我自己找不到任何东西)苹果推荐一个。 我个人的观点是使用它们的混合使用预处理器指令#defineextern *** *const似乎更有利,这就是我所做的。

如果你有一些全局常量,例如在你的前缀头文件中导入的Constants.h中,并且对这些常量使用了一个#definemacros,那么如果你对这些常量进行了任何修改,它将会重build你的整个项目。 在这种情况下,最好是分割你的常量,并使用externstring,整数和其他所有可以使用extern的东西。

例如,如果你有extern NSString *const kServerURL; 你改变你的服务器地址它不会重build你的整个项目,但如果你使用define,那么它将重build它。 所以至less对我来说唯一的目的是优化编译时间。