Objective-C中的全局常量

时间:2011-11-06 23:00:11

标签: iphone objective-c ios5 global-variables

我有一个名为 Constants.h 的文件:

extern NSString * const BASE_URL;

Constants.m

#ifdef DEBUG
    NSString * const BASE_URL = @"http://www.example.org ";
#else
    NSString * const BASE_URL = @"http://localhost";
#endif

第一个问题:如何将DEBUG切换为TrueFalse


我有一个视图控制器文件MyViewController.m

#import "MyViewController.h"
#import "Constants.h"

// this doesn't works. see above for the error.
static NSString * const ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];

@implementation HomeViewController

[...]

代码不起作用并返回此错误:

error: Semantic Issue: Initializer element is not a compile-time constant

我该如何解决这个问题?

我需要将几个全局字符串变量与其他字符串组合以创建各种URL。


更新1

现在Constants.m是:

#import "Constants.h"

#ifdef DEBUG
    #define DEF_BASE_URL "http://www.example.org/"
#else
    #define DEF_BASE_URL "http://localhost/"
#endif

NSString * const BASE_URL = (NSString*)CFSTR(DEF_BASE_URL);
NSString * const API_URL = (NSString*)CFSTR(DEF_BASE_URL "api/");
NSString * const API_SETTINGS_URL = (NSString*)CFSTR(API_URL "settings/");

但最后一行 Parse error:expected')'出错。 可能我只能将CFSTR用于宏。我需要找到一种获取所有全局变量的方法。

3 个答案:

答案 0 :(得分:6)

解决方案A:

就个人而言,我只会使用ANOTHER_URL的函数。

解决方案B:

如果你真的想要一个常量:你应该能够通过#define使用cstring连接规则,然后通过CFSTR()管道:

// defs.h
extern NSString * const BASE_URL;
extern NSString * const ANOTHER_URL;

// defs.m

#ifdef DEBUG
#define DEF_BASE_URL "http://www.example.org"
#else
#define DEF_BASE_URL "http://localhost"
#endif

NSString * const BASE_URL = (NSString*)CFSTR(DEF_BASE_URL);
NSString * const ANOTHER_URL = (NSString*)CFSTR(DEF_BASE_URL "/path/");

解决方案C:

如果你想通过初始化只创建一个,你也可以在C ++ / ObjC ++翻译中完成一个函数/方法本地静态(然后在需要时使用C或ObjC可见性):

NSString * URL() {
  static NSString * const ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];
  return ANOTHER_URL;
}

答案 1 :(得分:1)

首先,您可以告诉Xcode为调试版本设置一些预处理器宏。使用构建选项'预处理器宏'。

对于第二个问题,你不能调用objective-C方法来填充常量,因为这些东西在编译时是不可用的。您最好的选择是定义全局变量,然后在类'initialize'方法中为其赋值。

static NSString * ANOTHER_URL;

+ initialize {
    ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];
}
在创建第一个类实例之前调用

初始化,因此它是安全的。你必须删除const关键字,但我相信你可以相信自己! ;)

答案 2 :(得分:0)

#define DEBUG 1或0来禁用。

错误是因为您在编译常量时调用NSString方法。换句话说,你告诉编译器它无法处理的东西。您需要在启动时初始化这样的动态链接,编译器不能为您执行此操作。