在协议中定义NSArray常量

时间:2016-12-16 12:00:09

标签: ios objective-c nsarray compile-time-constant

我有一个协议类,我定义了多个包含这些字符串的字符串常量和数组常量。我正在移植一个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的方法?感谢

1 个答案:

答案 0 :(得分:1)

问题在于您尝试在编译时使用运行时功能,例如实例化数组([NSArray arrayWithObjects:]和文字形式@[]解析为运行时分配)。

常量字符串不会受此影响,因为编译器可以在二进制文件的data段中分配字符串所需的字节,但是数组不能这样做。

您需要的是一段代码,它将在您的应用程序启动时执行,从而能够访问运行时功能。

好消息是你可以通过__attribute__((constructor))修饰符来实现这一点,这个修饰符告诉编译器在加载二进制文件时执行修饰函数,这恰巧或不是应用程序启动时,在任何{{1代码执行。

AppDelegate

缺点是您需要放弃NSArray *constantAr; //... __attribute__((constructor)) static void initialize_constants() { constantArr = @[constant1, constant2]; } 修饰符,因此数组将不再是真正的常量。