Я немного смущен относительно того, когда лучше использовать:
static NSString *AppQuitGracefullyKey = @"AppQuitGracefully";
вместо
#define AppQuitGracefullyKey @"AppQuitGracefully"
Я видел вопросы как это для C или C++, и я думаю, что отличается, вот то, что это специально для Objective C, используя объект, и на устройстве как iPhone, может быть стек, пространство кода или проблемы памяти, которые я еще не схватываю.
Одно использование было бы:
appQuitGracefully = [[NSUserDefaults standardUserDefaults] integerForKey: AppQuitGracefullyKey];
Или это - просто вопрос стиля?
Спасибо.
Если вы используете статический, компилятор вставит ровно одну копию строки в ваш бинарный файл и просто передаст указатели на эту строку, в результате чего получится более компактный бинарный файл. Если вы используете #define, то при каждом использовании будет отдельная копия строки, хранящейся в исходном тексте. Постоянная коалесценция строк будет обрабатывать многие дубликаты, но вы заставляете компоновщик работать усерднее безо всякой причины.
Я использую Static
, когда мне нужно экспортировать символы NSString из библиотеки или рамки. Я использую #define
, когда мне нужна строка во многих местах, которые я могу легко изменить. В любом случае, компилятор и линкер позаботятся о оптимизациях.
См. «Статическое const» vs "#define" vs "enum" . Основное преимущество статического
является безопасность типа.
Кроме того, подход #define
вводит гибкость встроенного конкатенации строки, которая не может быть выполнена со статическими переменными, например,
#define ROOT_PATH @"/System/Library/Frameworks"
[[NSBundle bundleWithPath:ROOT_PATH@"/UIKit.framework"] load];
Но это, вероятно, не хороший стиль :).