2012-06-25 7 views
11

So che supporta variabili automatiche, ma che dire delle variabili di classe?Objective-C supporta le variabili di classe?

+0

possibile duplicato di [Variabile di stringa statica in Objective C su 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 –

risposta

23

La lingua non supporta le variabili di classe. Si implementa lo stato specifico della classe con le variabili globali static nelle unità di compilazione dell'implementazione.

Nell'intestazione (file .h):

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

Nell'implementazione (file .m):

static int val = 123; 

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

Usage:

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

questa lingua deve essere distrutta) – user924

+0

@ user924 Per tutti gli scopi pratici, la lingua è già morta. [Ti sei perso il promemoria?] (Https://developer.apple.com/swift /) – dasblinkenlight

+0

Lo so, ma ho bisogno di usare OpenCV, e qui usiamo ancora Objective-C – user924

4

variabili di classe objc sono semplici vecchie variabili statiche.

Foo.m:

static int foo = 0; 

In alternativa, è possibile utilizzare uno spazio dei nomi C++ anonimo se si utilizza objC++:

Foo.mm:

namespace { 
    int foo = 0; 
} 

Ma c'è un altro motivo, se si desidera beneficiare dai vantaggi delle proprietà:

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 = …; 

Può sembrare un po 'eccessivo, ma è una soluzione interessante. Si utilizzano gli stessi costrutti e le stesse caratteristiche del linguaggio per entrambe le proprietà dell'istanza e le proprietà di "classe". Atomicità su richiesta, accessor quando necessario, debugging, breakpoint ... Eredità anche.

Le menti creative possono trovare altri modi per fare tutto questo, suppongo. :) Ma sei praticamente coperto da queste opzioni.

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

Ma è necessario fornire getter e setter

Dalle Xcode 8 note di rilascio: Objective-C supporta ora proprietà della classe, che interagiscono con la proprietà del tipo di Swift. Sono dichiarati come: @property (class) NSString * someStringProperty ;. Non sono mai sintetizzati. (23891898)