Ich habe nur Antworten auf die ersten beiden deiner Fragen – weil ich nicht verstehe, was du mit deiner dritten meinst.
Lass mich mit Frage 2 anfangen:
Ist eine Objective-C-Static-Variable dasselbe wie eine C-Static-Variable?
Objective-C (ObjC) ist im Grunde genommen einfach nur Plain-Old-C (POC) – und eine raffinierte dynamische Laufzeitumgebung, die viele Raffinessen hinzufügt.
Dies bedeutet, dass jeder C-Sprachqualifizierer (z.B. static
) in ObjC genau so funktioniert wie in POC.
Also lautet die Antwort auf diese Frage: Ja.
Jetzt zurück zur ersten Frage:
Müssen wir Speicher für eine statische Variable in Objective-C mit alloc: bereitstellen und mit init: initialisieren?
Das Wichtige bei ObjC, worüber du immer informiert sein solltest, ist, dass es keine Objekte auf dem Stack gibt:
- Jedes Objekt, das du verwenden wirst, lebt im Heap.
- Daraus folgt, dass es unerheblich ist, in welchem Geltungsbereich (sei es stack-lokal,
static
oder global) du deine Objekttypvariablen deklarierst, sie werden im Allgemeinen immer effektiv mit alloc
/init
initialisiert.
Es gibt eine Ausnahme von diesen Regeln:
Blöcke beginnen zumindest als Stapelvariablen – aber das sind sowieso lustige Kreaturen.
Also, um diese Frage zu beantworten: Es gibt eigentlich keine Wahlmöglichkeit!
Abgesehen davon
Wenn du static
s für Objekte verwendest, die keine literalen NSStrings
sind – was durchaus vernünftig sein kann – erwäge sie aus Gründen der Vernunft in einem ordentlichen Klassenmethoden zu kapseln.
So kannst du es machen:
+ (NSNumber *)dieMagischeZahl
{
static NSNumber *magischeZahl;
static dispatch_once_t zahlenSemaphore;
dispatch_once( &zahlenSemaphore, ^{
magischeZahl = [NSNumber numberWithInt:3]; // 1
[magischeZahl retain]; // 2
} );
return magischeZahl;
}
Anmerkungen:
- Wie du wahrscheinlich weißt, gibt
+[NSNumber numberWithInt:]
ein autoreleased Objekt zurück!
- Da wir dieses Objekt behalten wollen, müssen wir es wie üblich
retain
– oder unseren Code mit ARC kompilieren und Zeilen wie diese ganz loswerden!
Ich hoffe, dieses Beispiel beantwortet deine letzte Frage oder hilft dir zumindest bei der Lösung.