Поддерживает ли 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)