我有一个协议类,我定义了多个包含这些字符串的字符串常量和数组常量。我正在移植一个android项目。
在我的Constants.h
中,我宣布NSString
& NSArray
常量如下:
#imports.....
extern NSString *const constant1;
extern NSString *const constant2;
extern NSArray *const constantArr;
@protocol.....
然后在我的Constants.m
中,我定义了这些常量:
#import "Constant.h"
NSString *const constant1 = @"Constant1";
NSString *const constant2 = @"Constant2";
//I get an error at this line
NSArray *const constantArr = [NSArray arrayWithObject: constant1, constant2, nil];
我在定义NSArray时遇到错误,它说Initializer element is not a compile-time constant
。我相信我可能会以错误的方式初始化NSArray。
有没有人遇到类似的问题或者知道初始化NSArray Constant的方法?感谢
答案 0 :(得分:1)
问题在于您尝试在编译时使用运行时功能,例如实例化数组([NSArray arrayWithObjects:]
和文字形式@[]
解析为运行时分配)。
常量字符串不会受此影响,因为编译器可以在二进制文件的data
段中分配字符串所需的字节,但是数组不能这样做。
您需要的是一段代码,它将在您的应用程序启动时执行,从而能够访问运行时功能。
好消息是你可以通过__attribute__((constructor))
修饰符来实现这一点,这个修饰符告诉编译器在加载二进制文件时执行修饰函数,这恰巧或不是应用程序启动时,在任何{{1代码执行。
AppDelegate
缺点是您需要放弃NSArray *constantAr;
//...
__attribute__((constructor))
static void initialize_constants() {
constantArr = @[constant1, constant2];
}
修饰符,因此数组将不再是真正的常量。