So che supporta variabili automatiche, ma che dire delle variabili di classe?Objective-C supporta le variabili di classe?
risposta
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) ...
questa lingua deve essere distrutta) – user924
@ user924 Per tutti gli scopi pratici, la lingua è già morta. [Ti sei perso il promemoria?] (Https://developer.apple.com/swift /) – dasblinkenlight
Lo so, ma ho bisogno di usare OpenCV, e qui usiamo ancora Objective-C – user924
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.
@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)
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) –
http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –