2009-06-11 13 views
27

Cómo crear & acceso cadena estática en iPhone (objetivo c)? Declaro static NSString *str = @"OldValue" en la clase A.Variable de cadena estática en el Objetivo C en iphone

Si asigno algún valor a esto en la clase B como str = @"NewValue". Este valor persiste para todos los métodos en la clase B. Pero si tengo acceso a él en la clase C (después de la asignación en B) lo obtengo como OldValue. ¿Me estoy perdiendo algo? ¿Debo usar extern en otras clases?

, gracias & Saludos, Yogini

Respuesta

44

Actualización: Como de Xcode 8, Objective-C hace tienen propiedades de clase. Tenga en cuenta que es principalmente azúcar sintáctica; estas propiedades no se auto-sintetizan, por lo que la implementación básicamente no ha cambiado desde antes.

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

Ver WWDC 2016 What's New in LLVM. La parte de la propiedad de clase comienza alrededor de la marca de 5 minutos.

respuesta original:

de Objective-C no tiene variables de clase, que es lo que creo que estás buscando. Puedes simularlo con variables estáticas, como lo estás haciendo.

Recomendaría poner el NSString estático en el archivo de implementación de su clase, y proporcionar los métodos de clase para acceder/mutarlo. Algo como esto:

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

Muchas gracias. Lo resolvió – Yogini

29

A diferencia de Java, donde una variable estática está en el ámbito de todas las instancias de una clase, static en C significa que una variable es accesible sólo desde dentro del archivo donde se declara. Le permite hacer cosas como declarar una variable estática dentro de una función, que establece el valor solo la primera vez, like this.

Una cosa que no ha mencionado es la relación entre las clases A, B y C. Si están en una jerarquía de herencia y espera que la variable estática se herede como en Java, el método descrito por zpasternack funcionará.

Si las tres clases no están relacionadas, y solo desea acceder al valor declarado en A, entonces extern es una forma más adecuada de hacerlo. En este caso, desea declarar la variable como extern en ClassA.h, luego definirla en Class.m. Siempre que ClassB y ClassC importen ClassA.h, podrán vincularse con la misma definición externa.

Un punto bueno es que, en vez de usar extern por sí mismo, es más robusto usar OBJC_EXPORT, que se define en objc-api.h y maneja la compilación bajo C++ también. Aquí hay un ejemplo de código:

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

Por supuesto, el uso de variables externed de esta manera crea una variable global infame, tan denostada, que es frágil en el que cualquiera puede leer o escribir en él, y el acceso es controlado. Este es el enfoque simple y responde a su pregunta sobre el uso de static frente a extern.Sin embargo, como principio de diseño, la encapsulación proporcionada al envolver la variable con métodos de clase es mucho más segura, aunque más compleja. En los lenguajes orientados a objetos, cuando el efecto que intenta lograr es el de un método estático de clase, es probable que la encapsulación sea el camino correcto.

+0

Muchas gracias. Lo resolvió – Yogini

+0

También he enfrentado el mismo problema que chicos .... – Sam97305421562

+0

lo que estaba buscando, gracias –