Objective c 条件编译:初始值设定项元素不是编译时常量

Objective c 条件编译:初始值设定项元素不是编译时常量,objective-c,ios,Objective C,Ios,我必须将一个变量分配给这样一个常量(下面的代码在我的文件代码的开头,在@implementation之前): 如果我愿意的话: #ifdef DEBUG static NSString * const host = @"xxx.mycompany.com"; #endif 那就行了 实际上,在我的实际情况中,host将包含全局值的值(在应用程序委托中声明,并在另一个视图控制器中初始化)。但是为了简化我的问题,我使用了这个例子(因为这两种情况都给了我相同的错误) 我怎样才能解决这个问题。Than

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

如果我愿意的话:

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

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


我怎样才能解决这个问题。Thanx。这里有几个问题

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

static int x = myFunction(459);
在程序实际运行之前,编译器无法知道myFunction()将返回什么

这就是为什么:

NSString *hostStr=[[NSString alloc]init];
导致语法错误。编译器在生成常量时不会执行任何代码


解决方案很简单:

NSString *host=@"www.mycompany.com";
注意,我没有使用“静态”限定符。这将使“主机”仅对声明它的文件中的代码可用。删除“静态”限定符将使其成为全局限定符

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

extern NSString *host;
此时,另一个文件将能够看到“主机”的内容

要指出的另一件事是:

NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";
真的没什么用。使用alloc/init创建NSString,然后立即分配
一个常量,将您创建的NSString移到一边,而不处理它,从而造成内存泄漏。(如果启用了ARC,则这不是问题。ARC无所不知。)

这里有几个问题

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

static int x = myFunction(459);
在程序实际运行之前,编译器无法知道myFunction()将返回什么

这就是为什么:

NSString *hostStr=[[NSString alloc]init];
导致语法错误。编译器在生成常量时不会执行任何代码


解决方案很简单:

NSString *host=@"www.mycompany.com";
注意,我没有使用“静态”限定符。这将使“主机”仅对声明它的文件中的代码可用。删除“静态”限定符将使其成为全局限定符

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

extern NSString *host;
此时,另一个文件将能够看到“主机”的内容

要指出的另一件事是:

NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";
真的没什么用。使用alloc/init创建NSString,然后立即分配 一个常量,将您创建的NSString移到一边,而不处理它,从而造成内存泄漏。(如果启用了ARC,则这不是问题。ARC无所不知。)