Objective-C: #define vs extern const

Я знаю, что этот вопрос задавали раньше, но я не могу найти информацию об этом в документации Apple; возможно, некоторые из вас, ребята, сделали.

Много Objective-C имеет константы кросс файла в файле .h, используя #define. Другие используют подход .m с константами и extern в файле .h.

Я понимаю разницу, и плюсы, и минусы, но Apple утверждает, какой из них использовать в разработке iOS?

Ответ 1

Apple рекомендация составляет extern:

Определите константы для строк, используемых для таких целей, как имена уведомлений и словарные ключи. Используя строковые константы, вы гарантируете, что компилятор проверяет правильное значение (то есть выполняет проверку орфографии).

По общему признанию, они иногда несовместимы с этим.

Ответ 2

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

Ответ 3

A #define определяет макрос, который заменяется до начала компиляции, где extern *** *const просто изменяет переменную, чтобы компилятор помешал ошибку, если вы попытаетесь ее изменить. Есть несколько случаев, когда вы использовали бы #define, потому что вы не можете использовать extern *** *const. Теоретически a extern *** *const будет занимать память и требует ссылки на память, но это ничтожно, поскольку она, возможно, оптимизирована вдали от компилятора.

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

Некоторые считают, что предпроцессорные директивы, такие как #define, не одобряют, что предполагает, что вы должны использовать extern *** *const над #define

Но пока предварительный процессор нахмурился, некоторые говорят, что он более безопасен, чем переменная, поскольку она не может быть изменена во время выполнения, тогда как переменная может.

У обоих есть преимущества и недостатки, и я не думаю (я ничего не могу найти сам), что Apple рекомендует один за другим. Мое личное мнение состоит в том, чтобы использовать их сочетание как с помощью предпроцессорной директивы #define по сравнению с extern *** *const, где было бы более полезно, это то, что я делаю.

Ответ 4

Если у вас есть некоторые глобальные константы, например, в Constants.h, который импортируется в ваш заголовок префикса, и вы используете макроС#define для этих констант, он собирается перестроить весь ваш проект, если вы внесете какие-либо изменения в эти константы. В этом случае лучше разделить свои константы и использовать extern для строк, целых чисел и всего остального, для которых вы можете использовать extern для.

Например, если у вас есть extern NSString *const kServerURL;, и вы меняете адрес сервера, он не собирается перестраивать весь ваш проект, но если вы используете определение там, он собирается его перестроить. Поэтому единственной целью, по крайней мере, для меня является оптимизация времени компиляции.