2009-06-11 4 views
27

Come creare la stringa statica & nell'iPhone (obiettivo c)? Dichiaro static NSString *str = @"OldValue" in classe A.Variabile di stringa statica nell'obiettivo C su iphone

Se assegno un valore a questo in classe B come str = @"NewValue". Questo valore persiste per tutti i metodi in classe B. Ma se accedo in classe C (dopo l'assegnazione in B) lo sto ottenendo come OldValue. Mi manca qualcosa? Dovrei usare extern in altre classi?

Grazie & Saluti, Yogini

risposta

44

Aggiornamento: Come di Xcode 8, Objective-C fa hanno proprietà di classe. Nota, è principalmente zucchero sintattico; queste proprietà non sono auto-sintetizzate, quindi l'implementazione è sostanzialmente invariata rispetto a prima.

// 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" 

Vedere WWDC 2016 What's New in LLVM. La parte della proprietà di classe inizia intorno al segno dei 5 minuti.

risposta originale:

Objective-C non ha variabili di classe, che è quello che penso che stai cercando. Puoi farlo finta con variabili statiche, come stai facendo.

Si consiglia di inserire NSString statico nel file di implementazione della classe e fornire metodi di classe per accedervi/mutarlo. Qualcosa di simile a questo:

// 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

Grazie mille. Risolto. – Yogini

29

A differenza di Java, dove una variabile statica è ambito per tutte le istanze di una classe, static in C significa che una variabile è accessibile solo dall'interno del file in cui viene dichiarato. Ti permette di fare cose come dichiarare una variabile statica all'interno di una funzione, che imposta il valore solo la prima volta, like this.

Una cosa che non ho menzionato è la relazione tra le classi A, B e C. Se sono in una gerarchia di ereditarietà e ci si aspetta che la variabile statica venga ereditata come in Java, il metodo descritto da zpasternack funzionerà.

Se le tre classi non sono correlate e si desidera solo accedere al valore dichiarato in A, quindi extern è un modo più appropriato per andare. In questo caso, si desidera dichiarare la variabile come extern in ClassA.h, quindi definirla in Class.m. Finché ClassB e ClassC importano ClassA.h, saranno in grado di collegarsi alla stessa definizione di extern.

Una punta fine è che, invece di utilizzare extern di per sé, è più robusto per usare OBJC_EXPORT, che è definito in objc-api.h e maniglie compilazione in C++ pure. Ecco un esempio di codice:

// 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 

Naturalmente, utilizzando le variabili externed in questo modo crea un infame, tanto diffamato variabile globale, che è fragile che chiunque può leggere o scrivere, e l'accesso è controllato. Questo è l'approccio semplice e risponde alla tua domanda sull'utilizzo di static rispetto a extern.Tuttavia, come principio di progettazione, l'incapsulamento fornito dal wrapping della variabile con i metodi di classe è molto più sicuro, anche se più complesso. Nei linguaggi orientati agli oggetti, quando l'effetto che stai cercando di ottenere è quello di un metodo statico di classe, l'incapsulamento è probabilmente la strada giusta da percorrere.

+0

Grazie mille. Risolto. – Yogini

+0

Ho anche affrontato lo stesso problema con ragazzi .... – Sam97305421562

+0

quello che stavo cercando, grazie –

Problemi correlati