为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2019-10-18 11:11:52
编译此代码时,出现错误“初始化元素不是编译时常量”。谁能解释为什么?#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
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超5个赞

当您在函数范围之外定义变量时,该变量的值实际上会写入可执行文件中。这意味着您只能使用恒定值。由于您在编译时不了解有关运行时环境的所有信息(哪些类可用,它们的结构等),因此,您必须等到运行时才能创建目标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;

}


查看完整回答
反对 回复 2019-10-18
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您当然可以如下所示#define宏。编译之前,编译器将用其值替换“ IMAGE_SEGMENT”。虽然将实现为数组定义全局查找,但它与全局变量不同。宏展开后,其作用与内联代码相同,因此每次都会创建一个新图像。因此,如果在使用宏的位置上格外小心,则可以有效地创建全局变量。


#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];

然后在需要的地方使用它,如下所示。每次执行以下代码,都会使用新的内存指针创建一个新对象。


imageSegment = IMAGE_SEGMENT


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 775 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信