Поддерживает ли переменные класса Objective-C?

Я знаю, что он поддерживает автоматические переменные, но как насчет переменных класса?

Ответ 1

Язык не поддерживает переменные класса. Вы реализуете состояние класса с глобальными переменными static в единицах компиляции реализации.

В заголовке (файл .h):

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

В реализации (файл .m):

static int val = 123;

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

Использование:

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

Ответ 2

Переменные класса objC представляют собой простые старые статические переменные.

Foo.m:

static int foo = 0;

В качестве альтернативы вы можете использовать анонимное пространство имен С++, если вы используете ObjС++:

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

Это может показаться немного излишним, но это интересное решение. Вы используете те же конструкции и языковые функции как для свойств экземпляра, так и для свойств класса. Атомация по требованию, аксессоры при необходимости, отладка, точки останова... Наследование даже.

Творческие умы могут найти другие способы сделать все это, я полагаю.:) Но вы в значительной степени охвачены этими параметрами.

Ответ 3

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

Но вы должны предоставить getter и setter

Из примечаний к выпуску Xcode 8: Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявляются как: @property (класс) NSString * someStringProperty;. Они никогда не синтезируются. (23891898)

Ответ 4

Свойства класса были добавлены назад в Xcode 8.x. Это не намного больше, чем если бы вы писали свои собственные сеттеры и геттеры как методы классов и использовали статику для хранения. На самом деле, все, что есть, кроме сообщений компилятора, см. ниже.

Objective-C теперь поддерживает свойства класса, которые взаимодействуют со свойствами типа Swift. Они объявлены как @property (class) NSString * someStringProperty; и никогда не синтезируются. (23891898)

https://developer.apple.com/library/archive/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

@interface MyClass

@property (class) NSObject *someClassProperty;
@property (class, readonly) NSString *aReadClassProperty;

@end

Если вы не добавите требуемые методы получения/установки, вы увидите следующие ошибки:

Свойство класса 'aReadClassProperty' требует определения метода 'aReadClassProperty' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса

Для свойства класса 'someClassProperty' требуется определить метод 'setSomeClassProperty:' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса

Для свойства класса 'someClassProperty' требуется определить метод 'someClassProperty' - используйте @dynamic или предоставьте реализацию метода в этой реализации класса

в вашей реализации вам понадобится:

@implementation MyClass

static NSObject *object;

+ (void)setSomeClassProperty:(NSObject *)someClassProperty {
    object = someClassProperty;
}

+ (NSObject *)someClassProperty {
    return object;
}

static NSString *string = @"My class string";

+ (NSString *)aReadClassProperty {
    return string;
}