Лучшие практики для локальных констант в цели-c

Я вижу много объективного-c кода, в котором просто #defines локальные константы это нуждается и затем продолжается на его веселом пути. Проблема состоит в том, что, насколько я знаю, #defines не ограничены по объему. Многие из этого находятся в собственном примере кода Apple. Например, в примере TableViewSuite 5, функция 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

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

Это - мой вопрос, который я предполагаю:

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

10
задан DougW 26 February 2010 в 22:08
поделиться

2 ответа

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

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

13
ответ дан 3 December 2019 в 18:33
поделиться

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

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

@implementation MyClass (KeyNames)

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

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

NSString *key=[MyClass creationDate_Key];

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

8
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

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