Я вижу много объективного-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?
#defines
в файлах реализации (.m) по определению привязаны к файлу, в котором они находятся, поскольку никто другой #include
не является файлом .m. (Вы действительно хотите тщательно обдумать это в общих файлах заголовков, где указанная вами проблема области видимости является реальной, и SO_QUESTION_2345197_NAMESPACE_YOUR_CONSTANTS_APPROPRIATELY.)
Для локальных констант в файлах реализации, о которых вы, кажется, спрашиваете about, #define
более эффективно компилируется, но вы не получаете символы при отладке. У локальных констант есть это преимущество, и в некоторых случаях (строковые константы? Может быть? Зависит) предотвращают дублирование постоянных данных в двоичном файле, хотя на данный момент размер и эффективность компиляции (и эффективность времени выполнения для их поиска) в основном шум, если вы не профилируете какую-то тугую петлю и не найдете в ней проблемы.
В последнее время я начал использовать методы класса для хранения констант. Я начал это как хакерство, чтобы сохранить имена ключей в безбожно огромной модели Core Data. Однако он оказался довольно эффективным как с точки зрения кода, так и с точки зрения создания и обслуживания базы кода. Я создаю такую категорию:
@interface MyClass (KeyNames)
+ (NSString *) creationDate_Key;
@end
@implementation MyClass (KeyNames)
+ (NSString *) creationDate_Key{
return @"creationDate";
}
@end
Затем я использую ее как:
NSString *key=[MyClass creationDate_Key];
У меня есть сценарий, который генерирует для меня методы. Самое интересное в том, что они имеют область видимости, наследуются и более компактны, чем длинные определения. Если мне нужно часто использовать ключ, например, в цикле, я просто помещаю его в локальную переменную, если эффективность становится проблемой.