Compiler-fout: “Initializer-element is geen compileer-time constant”

Bij het samenstellen van deze code, krijg ik de foutmelding “Initializer-element is geen compileer-time constant”. Kan iemand uitleggen waarom?

#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

Antwoord 1, Autoriteit 100%

Wanneer u een variabele buiten de reikwijdte van een functie definieert, wordt de waarde van die variabele daadwerkelijk in uw uitvoerbare bestand geschreven. Dit betekent dat u alleen een constante waarde kunt gebruiken. Aangezien u niet alles weet over de runtime-omgeving bij compileertijd (welke klassen beschikbaar zijn, wat is hun structuur, enz.), Kunt u geen objectieve C-objecten maken tot runtime, met uitzondering van constante snaren, die een specifiek verband houden structuur en gegarandeerd om op die manier te blijven. Wat u moet doen, is het initialiseren van de variabele tot nul en het gebruik van +initializeom uw afbeelding te maken. initializeis een klassenmethode die zal worden gebeld voordat een andere methode wordt opgeroepen op uw klas.

Voorbeeld:

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

Antwoord 2, Autoriteit 23%

Een globale variabele moet worden geïnitialiseerd naar een constante waarde, zoals 4of 0.0of @"constant string"of nil. Een objectconstructeur, zoals init, retourneert geen constante waarde.

Als u een globale variabele wilt hebben, moet u het initialiseren naar nilen deze dan retourneren met behulp van een klassenmethode:

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

Antwoord 3, Autoriteit 10%

Omdat u de compiler vraagt ​​om een ​​statische variabele initialiseert met code die inherent dynamisch is.


Antwoord 4, Autoriteit 6%

De reden is dat uw imageSegmentbuiten een functie in uw broncode (statische variabele) definieert.

In dergelijke gevallen kan de initialisatie geen uitvoering van de code omvatten, zoals het bellen van een functie of toewijzing van een klasse. Initializer moet een constante zijn wiens waarde bekend is bij compileertijd.

U kunt vervolgens uw statische variabele initialiseren in uw init-methode (als u zijn verklaring uitstelt naar Init).


Antwoord 5, Autoriteit 4%

U kunt zeker #define een macro zoals hieronder getoond. De compiler zal “Image_Segment” vervangen door zijn waarde vóór compilatie. Terwijl u een wereldwijde opzoeking voor uw array wilt behalen, is het niet hetzelfde als een globale variabele. Wanneer de macro wordt uitgebreid, werkt het net als inline-code en dus wordt er telkens een nieuwe afbeelding gemaakt. Dus als u voorzichtig bent in waar u de macro gebruikt, dan zou u effectief hebben bereikt met het maken van een globale variabele.

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

Gebruik het dan waar je het nodig hebt, zoals hieronder weergegeven. Elke keer dat de onderstaande code wordt uitgevoerd, wordt er een nieuw object gemaakt met een nieuwe geheugenaanwijzer.

imageSegment = IMAGE_SEGMENT

Other episodes