我知道这个问题以前已经被问过了,但我似乎在苹果的文档中找不到相关信息;也许你们中有些人知道。
很多Objective-C代码都有一个跨文件常量,使用#define
在一个.h
文件中定义。其他人则使用一种.m
包含常量并在.h
文件中使用extern
引用的方法。
我理解它们之间的区别,包括优缺点,但是苹果公司有没有说明在iOS开发中应该使用哪种方法呢?
我知道这个问题以前已经被问过了,但我似乎在苹果的文档中找不到相关信息;也许你们中有些人知道。
很多Objective-C代码都有一个跨文件常量,使用#define
在一个.h
文件中定义。其他人则使用一种.m
包含常量并在.h
文件中使用extern
引用的方法。
我理解它们之间的区别,包括优缺点,但是苹果公司有没有说明在iOS开发中应该使用哪种方法呢?
使用 #define 而非 extern 的问题在于编译器无法进行类型检查。如果你用 #define 定义一个字符串,那么在需要使用数字的地方也可能会不小心使用该字符串。如果使用静态 NSString,编译器将在你试图在其它不应该是字符串的地方使用时发出警告。
#define
定义了一个宏,它在编译开始之前被替换,而extern *** *const
仅仅修改变量,以便编译器会在你试图改变它时标记一个错误。有些情况下,你需要使用#define
,因为你不能使用extern *** *const
。理论上,extern *** *const
将占用内存并需要对内存的引用,但这是微不足道的,因为它可能会从编译器中优化掉。
extern *** *const
比#define
更加友好于编译器和调试,这可能是你选择使用哪个的决定因素。#define
这样的预处理指令是不受欢迎的,这表明你应该使用extern *** *const
而不是#define
。#define
和extern *** *const
,这就是我所做的。extern NSString *const kServerURL;
并更改服务器地址,则不会重新构建整个项目,但如果在那里使用define,则会重新构建。因此,至少对我来说,唯一的目的是优化编译时间。