Когда использовать статическую строку по сравнению с #define

Я немного смущен относительно того, когда лучше использовать:

static NSString *AppQuitGracefullyKey = @"AppQuitGracefully";

вместо

#define AppQuitGracefullyKey    @"AppQuitGracefully"

Я видел вопросы как это для C или C++, и я думаю, что отличается, вот то, что это специально для Objective C, используя объект, и на устройстве как iPhone, может быть стек, пространство кода или проблемы памяти, которые я еще не схватываю.

Одно использование было бы:

appQuitGracefully =  [[NSUserDefaults standardUserDefaults] integerForKey: AppQuitGracefullyKey];

Или это - просто вопрос стиля?

Спасибо.

45
задан mahboudz 19 January 2010 в 08:12
поделиться

3 ответа

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

60
ответ дан 26 November 2019 в 21:13
поделиться

Я использую Static , когда мне нужно экспортировать символы NSString из библиотеки или рамки. Я использую #define , когда мне нужна строка во многих местах, которые я могу легко изменить. В любом случае, компилятор и линкер позаботятся о оптимизациях.

3
ответ дан 26 November 2019 в 21:13
поделиться

См. «Статическое const» vs "#define" vs "enum" . Основное преимущество статического является безопасность типа.

Кроме того, подход #define вводит гибкость встроенного конкатенации строки, которая не может быть выполнена со статическими переменными, например,

#define ROOT_PATH @"/System/Library/Frameworks"
[[NSBundle bundleWithPath:ROOT_PATH@"/UIKit.framework"] load];

Но это, вероятно, не хороший стиль :).

14
ответ дан 26 November 2019 в 21:13
поделиться