2012-06-25 5 views
11

Sé que admite variables automáticas, pero ¿qué pasa con las variables de clase?¿Objective-C admite variables de clase?

+0

posible duplicado de [Variable de cadena estática en el Objetivo C en el iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-on-iphone) –

+0

http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –

Respuesta

23

El idioma no admite variables de clase. Implementa un estado específico de clase con las variables globales static en las unidades de compilación de la implementación.

En la cabecera (.h):

@interface MyClass : NSObject 
+(int)val; 
@end 

En la aplicación (archivo .m):

static int val = 123; 

@implementation MyClass 
+(int)val {return val;} 
@end 

Uso:

if ([MyClass val] > 100) ... 
+0

este lenguaje tiene que destruirse) – user924

+0

@ user924 Para todos los fines prácticos, el lenguaje ya está muerto. [¿Te has perdido la nota?] (Https://developer.apple.com/swift /) – dasblinkenlight

+0

Lo sé, pero necesito usar OpenCV, y aquí volvemos a utilizar Objective-C – user924

4

variables de clase son evidentes ObjC viejas variables estáticas.

Foo.m:

static int foo = 0; 

Alternativamente, se puede utilizar un espacio de nombres de C++ en el anonimato si se utiliza ObjC++:

Foo.mm:

namespace { 
    int foo = 0; 
} 

Pero hay otro patrón si quiere beneficiarse de las ventajas de las propiedades:

Foo.h:

@interface FooShared 

@property (atomic, readwrite, strong) Foo* foo; 

@end 

@interface Foo 

+ (FooShared*) shared; 

@end 

Foo.m:

@implementation FooShared 
@end 

static fooShared* = nil; 

@implementation Foo 

+ (FooShared*) shared 
{ 
    if (fooShared == nil) fooShared = [FooShared new]; 

    return fooShared; 
} 

@end 

somewhere.m:

Foo* foo …; 
foo.shared.foo = …; 

Puede parecer un poco exagerado, pero es una solución interesante. Utiliza las mismas construcciones y funciones de lenguaje para las propiedades de instancia y las propiedades de "clase". Atomicity on demand, accessors when needed, depuración, breakpoints ... Herencia incluso.

Las mentes creativas pueden encontrar otras formas de hacer todo esto, supongo. :) Pero estás bastante cubierto con estas opciones.

0
@property (class, nonatomic, copy) NSString *someStringProperty; 

pero hay que proporcionar getter y setter

De las notas de la versión de Xcode 8: Objective-C ahora es compatible con las propiedades de clase, los cuales interactúan con propiedades de tipo Swift. Se declaran como: @property (clase) NSString * someStringProperty ;. Ellos nunca son sintetizados. (23891898)

Cuestiones relacionadas