在协议中定义一个 NSArray 常量

Defining an NSArray Constant in a Protocol

我有一个协议 class,我在其中定义了多个包含这些字符串的字符串常量和数组常量。我正在移植一个 android 项目。

在我的 Constants.h 中,我声明 NSStringNSArray 常量如下:

#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 常量的方法?谢谢

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

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

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

好消息是,您可以通过 __attribute__((constructor)) 修饰符实现此目的,该修饰符告诉编译器在加载二进制文件时执行装饰函数,不管是否巧合,应用程序启动时,在任何 AppDelegate 代码执行。

NSArray *constantAr;

//...

__attribute__((constructor))
static void initialize_constants() {
    constantArr = @[constant1, constant2];
}

缺点是您需要放弃 const 修饰符,因此数组将不再是真正的常量。