Переменные уровня класса Objective-C

У меня есть класс Film, в каждом из которых хранится уникальный идентификатор. В C #, Java и т. Д. Я могу определить статический int currentID, и каждый раз, когда я устанавливаю ID, я могу увеличивать currentID, и изменение происходит на уровне класса, а не на уровне объекта. Можно ли это сделать в Objective-C? Мне было очень трудно найти ответ на этот вопрос.

141
задан Cœur 26 June 2019 в 12:51
поделиться

4 ответа

В вашем файле .m вы можете объявить переменную как статическую:

static ClassName *variableName = nil;

Затем вы можете инициализировать ее с помощью метода + (void) initialize .

Обратите внимание, что это обычная статическая переменная C, которая не является статической в ​​том смысле, в каком ее считают Java или C #, но дает аналогичные результаты.

29
ответ дан 23 November 2019 в 23:05
поделиться

Как сказано в pgb, нет «переменных класса», только «переменные экземпляра». Метод objective-c делать переменные класса - это статическая глобальная переменная внутри файла .m класса. "Static" гарантирует, что переменная не может использоваться вне этого файла (т.е. она не может быть extern).

11
ответ дан 23 November 2019 в 23:05
поделиться

В вашем файле .m объявите глобальную переменную файла:

static int currentID = 1;

, затем в своей подпрограмме инициализации укажите, что:

- (id) init
{
    self = [super init];
    if (self != nil) {
        _myID = currentID++; // not thread safe
    }
    return self;
}

или, если ее необходимо изменить в другое время (например, в вашем методе openConnection), а затем увеличьте его там. Помните, что он не является потокобезопасным как есть, вам нужно будет выполнить синхронизацию (или еще лучше использовать атомарное добавление), если могут возникнуть какие-либо проблемы с потоками.

16
ответ дан 23 November 2019 в 23:05
поделиться

Описание проблемы :

  1. Вы хотите, чтобы ваш ClassA имел переменную класса ClassB.
  2. Вы используете Objective-C в качестве языка программирования.
  3. Objective-C не поддерживает переменные класса, как C ++.

Одна альтернатива :

Имитируйте поведение переменной класса с помощью функций Objective-C

  1. Объявите / определите статическую переменную внутри classA. m, поэтому он будет доступен только для методов classA (и всего, что вы помещаете в classA.m).

  2. Перезаписать метод инициализации класса NSObject, чтобы инициализировать только один раз статическую переменную экземпляром ClassB.

  3. Вы будете интересно, зачем мне перезаписывать метод инициализации NSObject. В документации Apple по этому методу есть ответ: «Среда выполнения отправляет инициализацию каждому классу в программе ровно один раз непосредственно перед классом, или любому классу, который унаследован от него, отправляется первое сообщение из программы. (Таким образом, метод не может быть вызван, если класс не используется.) ".

  4. Не стесняйтесь использовать статическую переменную в любом методе класса / экземпляра ClassA.

Пример кода :

файл: classA.m

static ClassB *classVariableName = nil;

@implementation ClassA

...

+(void) initialize
{
    if (! classVariableName)
        classVariableName = [[ClassB alloc] init];
}

+(void) classMethodName
{
    [classVariableName doSomething]; 
}

-(void) instanceMethodName
{
    [classVariableName doSomething]; 
}

...

@end

Ссылки :

  1. Переменные класса объяснены, сравнивая подходы Objective-C и C ++
157
ответ дан 23 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: