webentwicklung-frage-antwort-db.com.de

Wie definiere ich eine globale Variable, auf die überall in meiner Anwendung zugegriffen werden kann?

Mögliches Duplikat:
Global int variable Objective C

Ich möchte eine globale Variable erstellen. Ich möchte überall auf diese Variable zugreifen.

Das Java Äquivalent:

static var score:int = 0;

Zum Beispiel, wenn ich globale Variablen in der Game-Klasse definiere. Wie kann man auf diese globale Variable zugreifen?

Game.score ?
32
Benoît Freslon

Wenn Ihre Anwendung mehrere Ansichten enthält und in diesem Fall eine Variable für jede Ansicht verfügbar sein soll, sollten Sie immer eine Modell-/Datenklasse erstellen und die Variable darin definieren. Etwas wie das :

Ziel-C:

//DataClass.h      
@interface DataClass : NSObject {    

    NSString *str;
}

@property(nonatomic,retain)NSString *str;    
+(DataClass*)getInstance;    
@end  


//DataClass.m    
@implementation DataClass    
@synthesize str;

static DataClass *instance = nil;

+(DataClass *)getInstance
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    
            instance= [DataClass new];    
        }    
    }    
    return instance;    
}    

Jetzt müssen Sie in Ihrem View-Controller diese Methode wie folgt aufrufen:

DataClass *obj=[DataClass getInstance];  
obj.str= @"I am Global variable";  

Diese Variable ist für jeden View Controller zugänglich. Sie müssen nur eine Instanz der Data-Klasse erstellen.

Swift:

class DataClass {

    private var str: String!

    class var sharedManager: DataClass {
        struct Static {
            static let instance = DataClass()
        }
        return Static.instance
    }
}

Verwendung : DataClass.sharedManager.str

Mit dispatch_once

class DataClass {

    private var str: String!

    class var sharedInstance: DataClass {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: DataClass? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = DataClass()
        }
        return Static.instance!
    }
}  

Verwendung : DataClass.sharedManager.str

95
Nitish

Objective-C unterstützt "Klassenvariablen" nicht direkt. Stattdessen können Sie eine Variable erstellen, die für den Bereich der Klassendatei gültig ist, und mit Klassenmethoden darauf zugreifen.

// outside the implementation
static int score = 0; // static means it is only accessible from the current file

@implementation Game

+ (int)score {
    return score;
}
+ (void)setScore:(int)newScore {
    score = newScore;
}
20
ughoavgfhw

Die bevorzugte Methode zum Implementieren globaler Variablen in einem iOS-Projekt (obwohl dies keine echten globalen Variablen sind) besteht darin, eine Eigenschaft im Anwendungsdelegaten zu erstellen und dann in jeder Ihrer Klassen auf diese Eigenschaft zuzugreifen.


EDIT: Wenn Sie Ihre Frage noch einmal lesen, scheint es, als hätte ich Ihre Frage falsch interpretiert, und die Antwort von ughoavgfhw ist wahrscheinlich genau das, wonach Sie suchen. Er hat recht, es gibt keine Klassenvariable in Objective-C, daher müssen Sie eine reguläre statische C-Variable erstellen und dann Klassenmethoden (bezeichnet mit dem + eher als ein -) zum Setzen und Holen.

Wenn ich jedoch "globale" Variablen in einer App benötige, erstelle ich Singleton-Klassen, um sie und ihre verwandten Methoden aufzunehmen (damit der App-Delegat nicht mit nicht verwandten Eigenschaften überläuft), oder wenn es sich um ein kleineres Projekt handelt, verwende ich einfach die Anwendung delegieren (was auch eine Singleton-Klasse ist) anstatt separate Singletons. Obwohl nichts an der statischen Variablen plus Class Setter/Getter-Methode auszusetzen ist, wenn dies für Ihre Anforderungen besser funktioniert.

7
Ben Baron