2 Stimmen

Statische Variable in Objective-C

Ich bin etwas verwirrt über die Speicherzuweisung von statischen Variablen in Objective-C.

  1. Sollten wir Speicher für eine statische Variable mit alloc: zuweisen und mit init: initialisieren?

  2. Ist eine Objective-C statische Variable dieselbe wie eine C statische Variable?

  3. Ist es sinnvoll, retain auf eine statische Variable anzuwenden?

4voto

Pablo Santa Cruz Punkte 169147

Es gibt ein paar Dinge, die Sie berücksichtigen müssen.

Erstens sind statische C-ähnliche Variablen innerhalb von Funktionen technisch in Ordnung. Dies sollte sein:

- (void) f
{
    static NSString* s = nil;
    if (s == nil) {
        s = [[NSString alloc] initWithString:@"Hallo"];
    }
}

Das Problem ist, dass Sie wahrscheinlich nie in der Lage sein werden, freizugeben, da der Gültigkeitsbereich von s nur die Funktion f ist.

Dies entspricht genau einer C-ähnlichen statischen Variable innerhalb einer Funktion.

Es gibt auch die Verwendung von static, um die Sichtbarkeit einer Variablen in einer Übersetzungseinheit zu kontrollieren. Wenn Sie also nur zulassen möchten, dass einige Variablen innerhalb von file.c zugegriffen werden können, genau wie in C, müssen Sie in dieser Datei schreiben:

static NSString *s = [[NSString alloc] initWithString:@"Hallo"];

Wieder einmal wird es wahrscheinlich Speicherleckage geben, es sei denn, Sie schreiben eine spezifische Methode zum Freigeben, wenn Ihre Anwendung endet.

Schließlich können Sie ein "objektorientiertes Verhalten" mit statischem Verhalten haben. Sie verwenden hier nicht das Schlüsselwort static, aber wie in den meisten objektorientierten Sprachen können Sie Klassenvariablen haben (in Java, C#, C++ und anderen Sprachen werden Klassenvariablen mit dem Schlüsselwort static erreicht).

4voto

danyowdee Punkte 4618

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 statics 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:

  1. Wie du wahrscheinlich weißt, gibt +[NSNumber numberWithInt:] ein autoreleased Objekt zurück!
  2. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X