No Xcode 8, você pode definir propriedades de classe no Obj-C. Isso foi adicionado para interoperar com as propriedades estáticas do Swift.
O Objective-C agora suporta propriedades de classe, que interoperam com as propriedades do tipo Swift. Eles são declarados como: @property (class) NSString * someStringProperty ;. Eles nunca são sintetizados. (23891898)
Aqui está um exemplo
@interface YourClass : NSObject
@property (class, nonatomic, assign) NSInteger currentId;
@end
@implementation YourClass
static NSInteger _currentId = 0;
+ (NSInteger)currentId {
return _currentId;
}
+ (void)setCurrentId:(NSInteger)newValue {
_currentId = newValue;
}
@end
Então você pode acessá-lo assim:
YourClass.currentId = 1;
val = YourClass.currentId;
Aqui está um post explicativo muito interessante que usei como referência para editar esta resposta antiga.
Resposta 2011: (não use isso, é terrível)
Se você realmente não quer declarar uma variável global, existe outra opção, talvez não muito ortodoxa :-), mas funciona ... Você pode declarar um método "get & set" como este, com uma variável estática dentro:
+ (NSString*)testHolder:(NSString*)_test {
static NSString *test;
if(_test != nil) {
if(test != nil)
[test release];
test = [_test retain];
}
// if(test == nil)
// test = @"Initialize the var here if you need to";
return test;
}
Portanto, se você precisar obter o valor, basta ligar para:
NSString *testVal = [MyClass testHolder:nil]
E então, quando você quiser configurá-lo:
[MyClass testHolder:testVal]
Caso deseje definir esse pseudo-static-var como nulo, você pode declarar testHolder
o seguinte:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
E dois métodos úteis:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
Espero que ajude! Boa sorte.