Wenn Sie eine Variable außerhalb des Funktionsumfangs definieren, wird der Wert dieser Variablen tatsächlich in Ihre ausführbare Datei geschrieben. Dies bedeutet, dass Sie nur einen konstanten Wert verwenden können. Da Sie zur Kompilierungszeit nicht alles über die Laufzeitumgebung wissen (welche Klassen verfügbar sind, wie ihre Struktur ist usw.), können Sie erst zur Laufzeit objektive c-Objekte erstellen, mit Ausnahme von konstanten Zeichenfolgen, denen eine bestimmte gegeben ist Struktur und garantiert so zu bleiben. Sie sollten die Variable auf Null initialisieren und +initialize
zum Erstellen Ihres Bildes verwenden. initialize
ist eine Klassenmethode, die aufgerufen wird, bevor eine andere Methode für Ihre Klasse aufgerufen wird.
Beispiel:
NSImage *imageSegment = nil;
+ (void)initialize {
if(!imageSegment)
imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
}
- (id)init {
self = [super init];
if (self) {
}
return self;
}
__attribute__ ((constructor))
.const
solche zu deklarieren ? Dh eine Variable, die nur einmal und nie wieder gesetzt werden kann?+initialize
Methode für verschiedene Klassen haben oder Funktionen aus anderen Dateien aufrufen, aber Sie müssen mit solchen Dingen wirklich vorsichtig sein. Es ist wirklich am besten, wenn möglich zu vermeiden.Eine globale Variable muss mit einem konstanten Wert wie
4
oder0.0
oder@"constant string"
oder initialisiert werdennil
. Ein Objektkonstruktor wie beispielsweiseinit
gibt keinen konstanten Wert zurück.Wenn Sie eine globale Variable haben möchten, sollten Sie sie initialisieren
nil
und dann mit einer Klassenmethode zurückgeben:NSImage *segment = nil; + (NSImage *)imageSegment { if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"]; return segment; }
quelle
Weil Sie den Compiler bitten, eine statische Variable mit Code zu initialisieren, der von Natur aus dynamisch ist.
quelle
Der Grund ist, dass Sie Ihre
imageSegment
Funktion außerhalb einer Funktion in Ihrem Quellcode definieren (statische Variable).In solchen Fällen kann die Initialisierung nicht die Ausführung von Code umfassen, z. B. das Aufrufen einer Funktion oder das Zuweisen einer Klasse. Der Initialisierer muss eine Konstante sein, deren Wert zur Kompilierungszeit bekannt ist.
Sie können dann Ihre statische Variable innerhalb Ihrer
init
Methode initialisieren (wenn Sie die Deklaration auf init verschieben).quelle
Sie können ein Makro wie folgt definieren. Der Compiler ersetzt "IMAGE_SEGMENT" vor dem Kompilieren durch seinen Wert. Sie können zwar eine globale Suche für Ihr Array definieren, diese ist jedoch nicht mit einer globalen Variablen identisch. Wenn das Makro erweitert wird, funktioniert es genau wie Inline-Code, sodass jedes Mal ein neues Bild erstellt wird. Wenn Sie also vorsichtig sind, wo Sie das Makro verwenden, hätten Sie effektiv eine globale Variable erstellt.
#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
Verwenden Sie es dann dort, wo Sie es benötigen, wie unten gezeigt. Jedes Mal, wenn der folgende Code ausgeführt wird, wird ein neues Objekt mit einem neuen Speicherzeiger erstellt.
imageSegment = IMAGE_SEGMENT
quelle