条件编译:初始化元素不是编译时常量

时间:2012-06-22 01:10:37

标签: objective-c ios

我必须将变量分配给这样的常量(下面的代码位于我的文件代码的开头,@implementation之前):

#ifdef DEBUG
NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";
static NSString * const host = hostStr;
#endif

如果我喜欢的话:

#ifdef DEBUG
static NSString * const host = @"xxx.mycompany.com";
#endif

这将有效。

实际上,在我的实际情况中,host将包含全局值的值(在app委托中声明并在另一个视图控制器中初始化)。但为了简化我的问题,我使用这个例子(因为两个案例都给我同样的错误)。

我该如何解决这个问题呢。提前完成。

1 个答案:

答案 0 :(得分:4)

这里有几个问题。

任何函数的外部的常量不能是“动态的”。这意味着编译器必须知道程序运行之前的常量值。如果你这样说:

static int x = myFunction(459);

在程序实际运行之前,编译器无法知道myFunction()将返回什么。

这就是原因:

NSString *hostStr=[[NSString alloc]init];

导致语法错误。在制作常量时,编译器不会执行任何代码。


解决方案很简单:

NSString *host=@"www.mycompany.com";

请注意,我没有使用“静态”限定符。这将使“主机”仅对其声明的文件中的代码可用。删除“静态”限定符使其成为全局。

要从另一个文件访问此全局变量,另一个文件需要声明

extern NSString *host;

此时另一个文件将能够看到“host”的内容。

另一点需要指出的是:

NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";

并没有真正做多少。使用alloc / init创建NSString,然后立即分配 它是一个常量,将您创建的NSString移动到一边,而不会丢弃它,从而造成内存泄漏。 (如果你启用了ARC,那么这是一个非问题.ARC知道所有。)