Каков правильный способ объявления статических переменных в 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, похожий на этот ответ.