87 votes

Erreur du compilateur: "l'élément initializer n'est pas une constante de compilation"

Lors de la compilation de ce code, j'obtiens le message d'erreur "L'élément initializer n'est pas une constante de compilation". Quelqu'un peut-il expliquer pourquoi?

 #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
 

115voto

ughoavgfhw Points 28400

Lorsque vous définissez une variable en dehors de la portée d'une fonction, cette variable valeur est écrite dans votre fichier exécutable. Cela signifie que vous pouvez uniquement utiliser une valeur constante. Car vous ne savez pas tout sur l'environnement d'exécution au moment de la compilation (les classes sont disponibles, ce qui est de leur structure, etc.), vous ne pouvez pas créer des objets objective-c jusqu'au moment de l'exécution, à l'exception des chaînes constantes, qui sont donnés une structure spécifique et de la garantie de rester de cette façon. Ce que vous devez faire est d'initialiser la variable à zéro et utiliser +initialize pour créer votre image. initialize est une méthode de la classe qui va être appelée avant toute autre méthode est appelée sur votre classe.

Exemple:

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;
}

26voto

mipadi Points 135410

Une variable globale doit être initialisée à une valeur constante, telle que 4 ou 0.0 ou @"constant string" ou nil . Un constructeur d'objet, tel que init , ne renvoie pas de valeur constante.

Si vous voulez avoir une variable globale, vous devez l’initialiser à nil puis la renvoyer en utilisant une méthode de classe:

 NSImage *segment = nil;

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

11voto

bbum Points 124887

Parce que vous demandez au compilateur d'initialiser une variable statique avec du code intrinsèquement dynamique.

6voto

sergio Points 52422

La raison en est que vous définissez votre imageSegment dehors d'une fonction dans votre code source (variable statique).

Dans de tels cas, l'initialisation ne peut pas inclure l'exécution de code, comme appeler une fonction ou affecter une classe. L'initialiseur doit être une constante dont la valeur est connue au moment de la compilation.

Vous pouvez ensuite initialiser votre variable statique dans votre méthode init (si vous retardez sa déclaration à init).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X