Поддерживает ли Objective-C переменные класса?
Я знаю, что он поддерживает автоматические переменные, но как насчет переменных класса?
3 ответов
язык не поддерживает переменные класса. Вы реализуете состояние класса с помощью global static
переменные в единицах компиляции выполнения.
в заголовке (.H-файл):
@interface MyClass : NSObject
+(int)val;
@end
в реализации (.файл м):
static int val = 123;
@implementation MyClass
+(int)val {return val;}
@end
использование:
if ([MyClass val] > 100) ...
переменные класса ObjC-это простые старые статические переменные.
Foo.m
:
static int foo = 0;
кроме того, вы можете использовать анонимное пространство имен C++, если используете ObjC++:
Foo.mm
:
namespace {
int foo = 0;
}
но есть еще один шаблон, если вы хотите воспользоваться преимуществами свойств:
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 = …;
это может выглядеть немного перебор, но это интересное решение. Вы используете одни и те же конструкции и языковые функции как для свойств экземпляра, так и для свойств "класса". Атомарность по требованию, аксессоры при необходимости, отладка, точки останова... Даже наследство.
творческие умы могут найти другие способы сделать все это, я полагаю. :) Но вы в значительной степени охвачены этими вариантами.
@property (class, nonatomic, copy) NSString *someStringProperty;
но вы должны предоставить getter и setter
из заметок о выпуске Xcode 8: Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявляются как: @property (class) NSString *someStringProperty;. Они не синтезируются. (23891898)