首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >编译器错误:“初始化程序元素不是编译时常量”

编译器错误:“初始化程序元素不是编译时常量”
EN

Stack Overflow用户
提问于 2011-05-27 02:07:34
回答 6查看 125K关注 0票数 80

在编译这段代码时,我收到错误消息"initializer元素不是编译时常量“。有谁能解释一下原因吗?

代码语言:javascript
复制
#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
EN

回答 6

Stack Overflow用户

发布于 2011-05-27 02:22:02

当您在函数的作用域之外定义变量时,该变量的值实际上会写入到可执行文件中。这意味着您只能使用常量值。由于您在编译时并不了解运行时环境的所有信息(哪些类可用,它们的结构是什么,等等),所以在运行之前您不能创建objective c对象,除了常量字符串,它被赋予一个特定的结构,并保证保持这种状态。您应该做的是将变量初始化为nil,并使用+initialize创建您的映像。initialize是一个类方法,它将在对类调用任何其他方法之前被调用。

示例:

代码语言:javascript
复制
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;
}
票数 110
EN

Stack Overflow用户

发布于 2011-05-27 02:14:17

全局变量必须初始化为常量值,如40.0@"constant string"nil。对象构造函数(如init )不返回常量值。

如果你想拥有一个全局变量,你应该将它初始化为nil,然后使用一个类方法返回它:

代码语言:javascript
复制
NSImage *segment = nil;

+ (NSImage *)imageSegment
{
    if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"];
    return segment;
}
票数 25
EN

Stack Overflow用户

发布于 2011-05-27 02:14:02

因为您要求编译器使用本质上是动态的代码来初始化静态变量。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6143107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档