Каков правильный способ объявления статических переменных в Objective-C?

Хорошо, все еще изменяя настройки при переключении между C, С++, С# и Objective-C, поэтому иногда моя голова вращается. Однако на этот раз я более смущен относительно правильного пути, так как видел как минимум три разных способа объявить статические переменные в Objective-C, а там четвертый, если вы считаете это просто супермножеством самого C. Итак, кто из них прав?

Дополнительный вопрос

Если мы хотим разделить автономную переменную (т.е. не статическую переменную класса, а только определенную в заголовке), это делается так же, как в 'C' (ala с 'extern' в заголовке? )


Вариант A

foo.h

@interface Foo : NSObject{
    static int Laa;
}

@end

Foo.m

@implementation Foo
    ...
@end

Вариант B

foo.h

@interface Foo : NSObject{
}

@end

Foo.m

static int Laa; // <-- Outside of the implementation

@implementation Foo
    ...
@end

Вариант C

foo.h

@interface Foo : NSObject{
}

@end

Foo.m

int Laa; // <-- Note no word 'static' here like in 'Option B'

@implementation Foo
    ...
@end

Вариант D

foo.h

static int Laa;

@interface Foo : NSObject{
}

@end

Foo.m

@implementation Foo
    ...
@end

Вариант E

foo.h

@interface Foo : NSObject{
}

@end

Foo.m

@implementation Foo

    static int Laa;

    ...

@end

Бонусный вопрос...

Вам нужно использовать слово extern или это только при использовании файлов .c/.С++, а не файлов .m/.mm?

Ответ 1

Неверный вариант A. Objective -c класс не имеет статической varibale.
Вариант B и E - правильный способ реализации статических переменных.
Параметр C создает глобальную переменную, доступ к которой можно получить вне файла реализации, используя ключевое слово extern.
Опция D снова создает глобальную статическую переменную, к которой можно получить доступ из любого места, просто импортируя файл .h. О вашем бонусном вопросе: ключевое слово extern имеет то же значение, что и в C/С++.

Ответ 2

Это зависит от того, что вы подразумеваете под "статикой". Objective-C получает статическое ключевое слово из C, поэтому оно не имеет ничего общего с классами. Если вы пытаетесь сделать переменную класса, как в С++, эквивалент Objective-C является глобальным внутри .m файл. Если вы используете статическое ключевое слово при объявлении глобального, оно гарантирует, что переменная не может быть extern 'd и использована в других файлах, что, вероятно, вам нужно.

Ответ 3

Поскольку вы предоставили множественный выбор, мне пришлось бы использовать вариант A. Это для статической переменной, видимой только внутри класса. Для доступа к нему извне вы должны написать собственный метод getter и setter, похожий на этот ответ.