Gui*_*oMB 12 cocoa objective-c
我在几篇文章和Apple的代码指南中读到,在Objective-C String常量中应该定义为extern,NSString *const MY_CONSTANT;
并且应该避免使用#define指令.这是为什么?我知道它#define
是在预编译时运行但所有字符串将共享相同的内存地址.我读到的唯一优势是,如果必须更新或更改常量,则不必重新编译整个项目.这就是为什么应该避免#define的原因?
谢谢
更新:在这种情况下使用#define还是有好办法还是有更好的方法?
/* Constants Definition */
#define SERVER_URL @"http://subdomain.domain.edu.ar/Folder/"
NSString *const ServerURL = SERVER_URL;
NSString *const LoginURL = SERVER_URL@"welcome.asp";
NSString *const CommandURL = SERVER_URL@"com.asp";
Run Code Online (Sandbox Code Playgroud)
e.J*_*mes 17
使用常量而不是定义的一个实际原因是您可以直接比较(使用==)而不是使用isEqual:
.考虑:
NSString * const kSomeStringConstant = @"LongStringConstantIsLong";
...
[someArray addObject:kSomeStringConstant];
if ([someArray lastObject] == kSomeStringConstant)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这可行,因为==
比较将相同的const指针与单个NSString
对象进行比较.#define
然而,使用:
#define STRING_CONSTANT @"MacrosCanBeEvil";
...
[SomeArray addObject:STRING_CONSTANT]; // a new const `NSString` is created
if ([someArray lastObject] == STRING_CONSTANT) // and another one, here.
{
...
}
Run Code Online (Sandbox Code Playgroud)
这将不工作了,因为这两个字符串就具有独特的指针.要有效地比较它们,您必须使用逐个字符进行比较isEqual:
if ([[someArray lastObject] isEqual:STRING_CONSTANT])
{
...
}
Run Code Online (Sandbox Code Playgroud)
就执行时间而言,这可能比简单==
比较成本高得多.
另一个动机可能是可执行文件本身的大小.#defined常量实际上会出现在代码中使用的任何位置.这可能意味着字符串在您的可执行文件中出现多次.相反,常量应该(使用现代编译器)只定义一次,并且所有进一步的用法都将引用指向该定义的指针.
现在,在有人对我进行过早优化之前,请考虑两种方法在实现方面几乎完全相同,但const指针方法在代码大小和执行时间方面要优越得多.
Chu*_*uck 10
对于整个应用程序中的给定字符串文字,不一定能保证只有一个NXConstantString对象.很可能不同的编译单元可能对同一个常量字符串有不同的对象.例如,如果某人编写插件,将为插件中的NSString文字的出现生成一个常量字符串,并且将为主机应用程序中的出现生成一个常量字符串,这些将不是指针相等的.
Ash*_*unn -2
据我所知,#define
只允许您定义 C 风格的字符串常量。要创建常量 NSString 对象,您必须在标头中声明它,然后在 .m 文件之一中为其赋予一个值。
头文件:
extern NSString *MyConstantString;
主要文件:
NSString *MyConstantString = @"String value";
归档时间: |
|
查看次数: |
26678 次 |
最近记录: |