14 Stimmen

Deklarieren von globalen Variablen im iPhone-Projekt

Wie kann ich ein globales NSArray deklarieren und es dann in meiner App verwenden?

27voto

Dave DeLong Punkte 240835

Es gibt verschiedene Möglichkeiten, dies zu tun:

  1. Anstatt sie als globale Variable zu deklarieren, verpacken Sie sie in ein Singleton-Objekt, das dann überall verfügbar ist (durch #Importieren der .h-Datei)

  2. Erstellen Sie eine .h-Datei, z. B. "Globals.h". In der .h-Datei deklarieren Sie Ihr Array als extern NSMutableArray * myGlobalArray; Dann in der irgendwo anders in Ihrer App (die AppDelegate ist ein guter Ort), nur tun: myGlobalArray = [[NSMutableArray alloc] init]; Wenn Sie das Array benötigen, brauchen Sie nur #import "Globals.h"

  3. Dies ist wie Nr. 2, aber ohne die globale Kopfzeile. Sie können Ihr Array definieren als extern NSMutableArray *myGlobalArray; innerhalb der #ifdef __OBJC__ Block der .pch-Datei Ihres Projekts. Die .pch-Datei ist eine Header-Datei, die automatisch in jede Datei in Ihrem Projekt #importiert wird.

Jeder Ansatz hat seine Vor- und Nachteile. Ich habe alle drei zu verschiedenen Zeiten und unter verschiedenen Umständen verwendet. Ich würde sagen, dass der Singleton-Ansatz wahrscheinlich am besten geeignet ist, da er für die Initialisierung, Zugriffsbeschränkung und Speicherverwaltung am flexibelsten ist. Es kann aber auch unnötig sein, wenn man das nicht braucht.

Option #2 ist gut, wenn Sie viele "globale" Variablen haben, die Sie nicht in jeder Datei Ihres Projekts offenlegen wollen. Sie können sie einfach #importieren, wo sie benötigt werden. Allerdings entkoppelt dieser Ansatz (wie auch #3) die Deklaration von der Initialisierung (d.h. das Objekt wird nicht in der Nähe des Deklarationsortes erzeugt). Einige mögen argumentieren, dass dies nicht richtig ist, und sie könnten Recht haben.

Option #3 ist gut, denn dann müssen Sie nie daran denken, überhaupt etwas zu #importieren. Allerdings wirft sie die gleichen Fragen auf wie Option #2.

8voto

kubi Punkte 46128

Eine 4. Antwort ist die Deklaration des Arrays in Ihrer UIApplicationDelegate und greifen Sie auf sie zu über

[[[UIApplication sharedApplication] delegate] myArray];

Wenn ich nur eine Handvoll globaler Objekte benötige, ist dies der einfachste und sauberste Weg.

2voto

AlBlue Punkte 21966

Wenn Sie erwägen, eine Art von gemeinsamen Einstellungen für Ihre Anwendung zu speichern, verwenden Sie [NSUserDefaults sharedDefaults], um einfache Daten zu speichern, die app-übergreifend verwendet werden können. Wenn Sie flüchtige Daten speichern, dann funktioniert der "statische" Ansatz wie anderswo auch.

Es ist jedoch wahrscheinlich besser, ein Singleton-Objekt mit einem Klassen-Accessor zu verwenden, wie NSUserDefaults, und dann Instanz-Accessor-Methoden bereitzustellen, um Ihre Daten zu erfassen. Auf diese Weise isolieren Sie sich von möglichen zukünftigen Änderungen der Datenstruktur. Sie verwenden dann eine statische Variable, wie oben beschrieben, aber innerhalb der .m-Datei (und benötigen daher keine "externe" Definition). Das würde typischerweise so aussehen:

static Foo *myDefault = nil;
@implementation Foo
+(Foo)defaultFoo {
  if(!myDefault)
    myDefault = [[Foo alloc] init]; // effective memory leak
  return myDefault;
}
@end

Sie würden dann Instanz Accessors haben, und verwenden Sie sie als [[Foo defaultFoo] myArray], die von jedem Teil der Anwendung zugegriffen werden kann, und ohne Kompilierzeit Fehler.

1voto

Seva Alekseyev Punkte 57252

Jeder hier scheint eine implizite, ausgelassene erste Zeile zu haben: "Sie können es im K&R C-Stil machen, oder..."

Ja, Sie können es immer noch im C-Stil machen.

In Datei 1:

NSArray *MyArray;

In Datei 2:

extern NSArray *MyArray;

Ich spiele hier Captain Obvious.

1voto

Ethan Allen Punkte 13706

In Bezug auf die Antwort von Dave hier:

Dies ist wie #2, aber ohne den globalen Header. Sie können Ihr Array als statisches externes NSMutableArray *myGlobalArray definieren; innerhalb der #ifdef OBJC Block der .pch-Datei Ihres Projekts. Die .pch-Datei ist eine Header-Datei, die automatisch in jede Datei in Ihrem Projekt #importiert wird.

typedef ist eine Speicherklasse und static ist eine Speicherklasse, und Sie können Objekte nur in einer Speicherklasse definieren. Wenn Sie "static" herausnehmen, kann die Anwendung mit Ihrer obigen Antwort kompiliert werden.

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