在协议中定义一个 NSArray 常量
Defining an NSArray Constant in a Protocol
我有一个协议 class,我在其中定义了多个包含这些字符串的字符串常量和数组常量。我正在移植一个 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 常量的方法?谢谢
问题是您试图在编译时使用运行时功能,例如实例化数组([NSArray arrayWithObjects:]
和文字形式 @[]
都解析为运行时分配)。
常量字符串不受此影响,因为编译器可以在二进制文件的 data
段中分配字符串所需的字节,但是数组不能这样做。
您需要的是一段将在您的应用程序启动时执行的代码,从而能够访问运行时功能。
好消息是,您可以通过 __attribute__((constructor))
修饰符实现此目的,该修饰符告诉编译器在加载二进制文件时执行装饰函数,不管是否巧合,应用程序启动时,在任何 AppDelegate
代码执行。
NSArray *constantAr;
//...
__attribute__((constructor))
static void initialize_constants() {
constantArr = @[constant1, constant2];
}
缺点是您需要放弃 const
修饰符,因此数组将不再是真正的常量。
我有一个协议 class,我在其中定义了多个包含这些字符串的字符串常量和数组常量。我正在移植一个 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 常量的方法?谢谢
问题是您试图在编译时使用运行时功能,例如实例化数组([NSArray arrayWithObjects:]
和文字形式 @[]
都解析为运行时分配)。
常量字符串不受此影响,因为编译器可以在二进制文件的 data
段中分配字符串所需的字节,但是数组不能这样做。
您需要的是一段将在您的应用程序启动时执行的代码,从而能够访问运行时功能。
好消息是,您可以通过 __attribute__((constructor))
修饰符实现此目的,该修饰符告诉编译器在加载二进制文件时执行装饰函数,不管是否巧合,应用程序启动时,在任何 AppDelegate
代码执行。
NSArray *constantAr;
//...
__attribute__((constructor))
static void initialize_constants() {
constantArr = @[constant1, constant2];
}
缺点是您需要放弃 const
修饰符,因此数组将不再是真正的常量。