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

编译此代码时,出现错误“初始化元素不是编译时常量”。谁能解释为什么?


#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


慕哥6287543
浏览 779回答 3
3回答

杨魅力

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

慕无忌1623718

您当然可以如下所示#define宏。编译之前,编译器将用其值替换“ IMAGE_SEGMENT”。虽然将实现为数组定义全局查找,但它与全局变量不同。宏展开后,其作用与内联代码相同,因此每次都会创建一个新图像。因此,如果在使用宏的位置上格外小心,则可以有效地创建全局变量。#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];然后在需要的地方使用它,如下所示。每次执行以下代码,都会使用新的内存指针创建一个新对象。imageSegment = IMAGE_SEGMENT
打开App,查看更多内容
随时随地看视频慕课网APP