2009-08-08 7 views

Antwort

26

Es gibt ein paar verschiedene Möglichkeiten, wie Sie dies tun können:

  1. Statt es als globale Variable zu deklarieren, wickeln Sie es in ein Singleton-Objekt, dann die Singleton überall durch zur Verfügung haben (durch die #importing .h-Datei)

  2. Erstellen Sie eine .h-Datei wie "Globals.h". In der .h, erklären Sie Ihre Array als extern NSMutableArray * myGlobalArray; Dann in der woanders in der App (die AppDelegate ein guter Platz), nur tun: myGlobalArray = [[NSMutableArray alloc] init]; Dann überall Sie das Array benötigen, nur #import "Globals.h"

  3. Das ist wie # 2 , aber ohne den globalen Header. Sie können Ihr Array als extern NSMutableArray *myGlobalArray; im #ifdef __OBJC__-Block der Projektdatei Ihres Projekts definieren. Die .pch-Datei ist eine Headerdatei, die automatisch in jede Datei in Ihrem Projekt importiert wird.

Es gibt Vor- und Nachteile von jedem Ansatz. Ich habe alle drei zu unterschiedlichen Zeiten in unterschiedlichen Umständen verwendet. Ich würde sagen, dass der Singleton-Ansatz wahrscheinlich der geeignetste ist, da er für die Initialisierung, Zugriffsbeschränkung und Speicherverwaltung am flexibelsten ist. Es kann jedoch unnötig sein, wenn Sie das nicht benötigen.

Option # 2 ist nett, wenn Sie viele "globale" Variablen haben, die Sie nicht für jede Datei in Ihrem Projekt freigeben möchten. Sie können es einfach dorthin importieren, wo es gebraucht wird. Dieser Ansatz (und auch Nr. 3) trennt jedoch die Deklaration von der Initialisierung (dh das Objekt wird nicht in der Nähe dessen, wo es deklariert ist, erzeugt). Manche mögen argumentieren, dass das nicht korrekt ist, und sie könnten richtig sein.

Option # 3 ist nett, weil Sie dann nie daran denken müssen, irgendetwas zu importieren. Es wirft jedoch die gleichen Fragen wie die Option # 2 auf.

+0

Hallo i habe die dritte Option benutzt, aber wenn ich ** statisch extern NSMutableArray * myGlobalA verwende rray; ** es gibt einen Fehler von ** Mehrere Speicherklassen im Deklarationsspezifizierer ** – rptwsthi

+1

@rptwsthi yeah sorry. Entfernen Sie einfach das "statische" Bit. –

+0

das letzte Mal, dass ich die gewünschte Antwort vom dritten Weg nicht erreicht habe, aber diesmal habe ich es getan. Danke für diesen netten Beitrag. :) – rptwsthi

8

Eine vierte Antwort ist das Array in Ihrem UIApplicationDelegate und Zugriff auf sie durch

[[[UIApplication sharedApplication] delegate] myArray]; 

Für Zeiten zu erklären, wenn ich nur eine Handvoll globaler Objekte benötigen, fand ich dies die einfachste und sauberste Weg ist, es zu tun .

+6

+1 Dies ist auch ein guter Ansatz. Der einzige Nachteil ist, dass es eine Compiler-Warnung erzeugt, da - [UIApplication delegate] ein Objekt vom Typ id zurückgibt, das keine "myArray" -Methode hat. Die Lösung wäre es zu casten, aber das macht die Leitung etwas schwieriger zu machen: '[(MyAppDelegate *) [[UIApplication sharedApplication] delegate] myArray];' –

+1

Außerdem bedeutet Casting, dass Sie auch die # importieren müssen MyAppDelegate-Headerdatei –

+0

Ich benutze Xcode 4.3. Die von Ihnen erwähnte Situation wird einen Fehler erzwingen, nicht nur eine Warnung. – Philip007

2

Wenn Sie eine Art von gemeinsamen Einstellungen für Ihre App speichern möchten, verwenden Sie [NSUserDefaults sharedDefaults], um einfache Daten zu erhalten, die in der gesamten App verwendet werden können. Wenn Sie transiente Daten speichern, funktioniert der statische Ansatz wie anderswo.

Es ist jedoch wahrscheinlich besser, einen Singleton-Objektansatz mit einem Klassenaccessor wie NSUserDefaults zu verwenden und dann Instanzzugriffsmethoden bereitzustellen, um Ihre Daten zu erfassen. Auf diese Weise werden Sie sich in Zukunft von möglichen Änderungen der Datenstruktur isolieren. Sie würden dann eine statische Variable, wie oben, aber innerhalb der .m-Datei verwenden (und daher brauchen Sie die 'extern'-Definition nicht). Es würde in der Regel wie folgt 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 Accessoren haben, und sie als [[Foo defaultFoo] myArray], die von jedem Teil der App zugegriffen werden kann, und ohne Kompilierung Fehler.

1

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

Ja, können Sie noch tun es im C-Stil

In Datei. 1:

NSArray *MyArray; 

In Datei. 2:

extern NSArray *MyArray; 

Spielen Captain Obvious hier

+1

Es ist nicht so offensichtlich, ich denke, es ist ziemlich üblich für neue Obj-C-Entwickler, keine C-Erfahrung zu haben. – kubi

1

In Bezug auf Daves Antwort hier:

Dies ist wie # 2, aber ohne den globalen Header. Sie können Ihr Array als statisch extern definieren NSMutableArray * myGlobalArray; innerhalb des #ifdef OBJC Blocks der Projektdatei .pch. Die .pch-Datei ist eine Headerdatei, die automatisch in jede Datei in Ihrem Projekt importiert wird.

typedef ist eine Speicherklasse und static ist eine Speicherklasse, und Sie können nur Objekte in einer Speicherklasse definieren. Wenn Sie "statisch" auswählen, wird die App mit der obigen Antwort kompiliert.

0

Es gibt mehrere Möglichkeiten. Die beliebtesten:

1 Verwenden Sie Singleton-Objekt - http://www.galloway.me.uk/tutorials/singleton-classes/

2 Deklarieren Sie es in AppDelegate:

@interface Your_App_Delegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) NSArray *array; 
    . . . 

und Zugang es:

((Your_App_Delegate*)[[UIApplication sharedApplication] delegate]).array; 

3 Verwenden NSUserDefault