在编译这段代码时,我收到错误消息"initializer元素不是编译时常量“。有谁能解释一下原因吗?
#import "PreferencesController.h"
@implementation PreferencesController
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
NSImage* imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];//error here
发布于 2011-05-27 02:22:02
当您在函数的作用域之外定义变量时,该变量的值实际上会写入到可执行文件中。这意味着您只能使用常量值。由于您在编译时并不了解运行时环境的所有信息(哪些类可用,它们的结构是什么,等等),所以在运行之前您不能创建objective c对象,除了常量字符串,它被赋予一个特定的结构,并保证保持这种状态。您应该做的是将变量初始化为nil,并使用+initialize
创建您的映像。initialize
是一个类方法,它将在对类调用任何其他方法之前被调用。
示例:
NSImage *imageSegment = nil;
+ (void)initialize {
if(!imageSegment)
imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
}
- (id)init {
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
发布于 2011-05-27 02:14:17
全局变量必须初始化为常量值,如4
、0.0
、@"constant string"
或nil
。对象构造函数(如init
)不返回常量值。
如果你想拥有一个全局变量,你应该将它初始化为nil
,然后使用一个类方法返回它:
NSImage *segment = nil;
+ (NSImage *)imageSegment
{
if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"];
return segment;
}
发布于 2011-05-27 02:14:02
因为您要求编译器使用本质上是动态的代码来初始化静态变量。
https://stackoverflow.com/questions/6143107
复制相似问题