Рекомендации по локальным константам в objective-c

Я вижу много кода objective-c, который просто # определяет локальные константы, в которых он нуждается, и затем продолжает свой веселый путь. Проблема в том, что, насколько я знаю, #defines не ограничены. Многие из них находятся в собственном примере кода Apple. Например, в примере TableViewSuite функция drawRect в TimeZoneView.m содержит следующий блок:

#define LEFT_COLUMN_OFFSET 10
#define LEFT_COLUMN_WIDTH 130

#define MIDDLE_COLUMN_OFFSET 140
#define MIDDLE_COLUMN_WIDTH 110

#define RIGHT_COLUMN_OFFSET 270

#define UPPER_ROW_TOP 8
#define LOWER_ROW_TOP 34

#define MAIN_FONT_SIZE 18
#define MIN_MAIN_FONT_SIZE 16
#define SECONDARY_FONT_SIZE 12
#define MIN_SECONDARY_FONT_SIZE 10

Есть ли какая-то причина, по которой я не понимаю, что это не абсурдно опасно? Как минимум, не должны ли мы указывать эти константы в конце функции?

Что мой вопрос, я полагаю:

Лучше ли вам определять, что вам нужно в файле, который вам нужен, и не определять его в конце? Или вы считаете, что лучше использовать статические константы для этого типа вещей? Существует ли ограничение производительности при использовании статических констант или компилятор способен обрабатывать их так же эффективно, как #define?

Ответ 1

#defines в файлах реализации (.m) по определению привязаны к файлу, в котором они находятся, поскольку ни один другой #include..m файл. (Вы хотите тщательно обдумать это в общих заголовочных файлах, где проблема определения области действия, о которой вы упоминаете, является реальной, и SO_QUESTION_2345197_NAMESPACE_YOUR_CONSTANTS_APPROPRIATELY.)

Для локальных констант в файлах реализации, о которых вы, похоже, спрашиваете, #define более эффективен для компиляции, но вы не получаете символы при отладке. Локальные константы имеют такую ​​выгоду, и в некоторых случаях (константы строки? Может быть?) Зависят от предотвращения дублирования постоянных данных в двоичном формате, хотя на данный момент в мире эффективность и эффективность компиляции (и эффективность выполнения для их просмотра) в основном шум, если вы не прокомментируете узкую петлю и не найдете проблемы с ней.

Ответ 2

В последнее время я начал использовать методы класса для хранения констант. Я начал его как взломать для хранения имен ключей в нечестивой огромной модели Core Data. Однако он оказался весьма эффективным как в коде, так и в основе создания и обслуживания кодовой базы. Я генерирую такую ​​категорию:

@interface MyClass (KeyNames)
+ (NSString *) creationDate_Key;
@end

@implementation MyClass (KeyNames)

+ (NSString *) creationDate_Key{
    return @"creationDate";
} 
@end

Затем я использую его как:

NSString *key=[MyClass creationDate_Key];

У меня есть script, который генерирует для меня методы. Оптимальным является то, что они охвачены областью, унаследованы и более компактны, чем длинные. Если мне нужно много использовать ключ, как в цикле, я просто припаркую его в локальной переменной, если эффективность становится проблемой.