2009-06-11 8 views
27

Wie erstellt man & Zugriff statische Zeichenfolge in iPhone (Ziel c)? Ich erkläre static NSString *str = @"OldValue" in Klasse A.Statische String-Variable in Objective C auf iPhone

Wenn ich dies in Klasse B als str = @"NewValue" einen Wert zuweisen. Dieser Wert bleibt für alle Methoden in Klasse B. Aber wenn ich darauf in Klasse C zugreifen (nach Zuweisung in B) bekomme ich es als OldValue. Fehle ich etwas? Sollte ich extern in anderen Klassen verwenden?

Dank & Grüße, Yogini

Antwort

44

Update: Ab Xcode 8, Objective-C hat Klasse Eigenschaften. Beachten Sie, dass es hauptsächlich syntaktischer Zucker ist; Diese Eigenschaften sind nicht automatisch synthetisiert, so dass die Implementierung im Grunde unverändert ist.

// MyClass.h 
@interface MyClass : NSObject 
@property(class, copy) NSString* str; 
@end 

// MyClass.m 
#import "MyClass.h" 

@implementation MyClass 

static NSString* str; 

+ (NSString*) str 
{ 
    return str; 
} 

+ (void) setStr:(NSString*)newStr 
{ 
    if(str != newStr) { 
     str = [newStr copy]; 
    } 
} 
@end 


// Client code 
MyClass.str = @"Some String"; 
NSLog(@"%@", MyClass.str); // "Some String" 

Siehe WWDC 2016 What's New in LLVM. Der Klasseneigenschaftsteil beginnt ungefähr bei der 5-Minuten-Marke.

Ursprüngliche Antwort:

Objective-C nicht über Klassenvariablen, das ist, was ich denke, Sie suchen. Sie können es mit statischen Variablen fälschen, wie Sie es tun.

Ich würde empfehlen, die statische NSString in die Implementierungsdatei Ihrer Klasse setzen und Klassenmethoden für den Zugriff/muate es bereitstellen. Etwas wie folgt aus:

// MyClass.h 
@interface MyClass : NSObject { 
} 
+ (NSString*)str; 
+ (void)setStr:(NSString*)newStr; 
@end 

// MyClass.m 
#import "MyClass.h" 

static NSString* str; 

@implementation MyClass 

+ (NSString*)str { 
    return str; 
} 

+ (void)setStr:(NSString*)newStr { 
    if (str != newStr) { 
     [str release]; 
     str = [newStr copy]; 
    } 
} 
@end 
+0

Vielen Dank. Es gelöst. – Yogini

29

Im Gegensatz zu Java, wo eine statische Variable für alle Instanzen einer Klasse scoped ist, static in C bedeutet, dass eine Variable zugänglich ist nur innerhalb der Datei, in der sie deklariert ist. Sie können beispielsweise eine statische Variable in einer Funktion deklarieren, die den Wert nur beim ersten Mal festlegt, like this.

Eine Sache, die Sie nicht erwähnt haben, ist die Beziehung zwischen den Klassen A, B und C. Wenn sie in einer Vererbungshierarchie sind und Sie erwarten, dass die statische Variable wie in Java geerbt wird, wird die Methode von zpastenack wird funktionieren.

Wenn die drei Klassen nicht verwandt sind und Sie nur auf den in A deklarierten Wert zugreifen möchten, ist extern ein geeigneterer Weg. In diesem Fall möchten Sie die Variable in ClassA.h als extern deklarieren und dann in Class.m definieren. Solange ClassB und ClassC ClassA.h importieren, können sie mit derselben externen Definition verlinken.

ein feiner Punkt ist, dass, statt extern selbst verwenden, es robuster ist OBJC_EXPORT zu verwenden, die in objc-api.h definiert ist und Griffe unter C++ und kompilieren. Hier ist ein Codebeispiel:

// ClassA.h 
OBJC_EXPORT NSString* commonString; 
... 

// ClassA.m 
NSString* commonString = @"OldValue"; 

// ClassB.m 
#import "ClassA.h" 
... 
commonString = @"NewValue"; // Can be inside a function or method 

Natürlich mit externed Variablen auf diese Weise ein berüchtigtes schafft, viel geschmähte globale Variable, die in diesem jemand zerbrechlich ist, kann es lesen oder schreiben, und der Zugang ist unkontrolliert. Dies ist der einfache Ansatz und beantwortet Ihre Frage zur Verwendung von static vs. extern.Als Konstruktionsprinzip ist die Kapselung durch Umhüllen der Variablen mit Klassenmethoden jedoch viel sicherer, wenn auch komplexer. Wenn in objektorientierten Sprachen der Effekt, den Sie erreichen möchten, der einer statischen Klassenmethode entspricht, ist die Kapselung wahrscheinlich der richtige Weg.

+0

Vielen Dank. Es gelöst. – Yogini

+0

Ich habe auch das gleiche Problem thnx Jungs konfrontiert .... – Sam97305421562

+0

was ich suchte, danke –

Verwandte Themen