Какова стоимость включения (фактически, вызова #import) файла заголовка в Objective-C?
Компилятор может закончить читать эти файлы без необходимости. После редактирования #import
дополнительные файлы необходимо будет проанализировать, скомпилировать и т. Д. Для каждого перевода (например, .m
файл), в котором он виден, что значительно увеличивает время сборки и компоновки. В 10 раз больше не удивительно.
Мне надоело постоянно включать одни и те же заголовки в разные места, поэтому я решил просто создать файл GlobalReferences.h, который включает в себя несколько часто упоминаемых заголовков.
Как правило, это очень плохой подход. Общая проблема заключается в том, что при изменении любого из файлов, включенных в GlobalReferences.h, весь ваш проект и все промежуточные зависимости необходимо перестраивать, перекомпоновывать и т. Д.
Я предпочитаю разделять программы на маленькие библиотеки или пакеты, в которых существует такая взаимозависимость (например, StoreKit.framework - это небольшой пакет / библиотека), но заполнение этих библиотек / фреймворков / пакетов в заголовках ничего не решает. Кроме того, предварительные объявления и хранение ваших данных в продолжении класса или @implementation
могут значительно уменьшить зависимости (поскольку вы можете локализовать включение библиотеки / заголовка только для необходимых переводов).
Наконец, очистка после отложенных включений занимает очень много времени, особенно когда их много, и вы подождали, пока время сборки вашего проекта будет невыносимо медленным. По сути, вы должны вернуться и выбрать ненужные зависимости, перестроить, повторить (в течение нескольких дней).
Есть ли заметная плата за включение ссылок на другие файлы, если они даже не используются?
Абсолютно. Чем больше растут ваши проекты, тем хуже становится ленивое включение. Несколько отложенных включений в большом проекте могут добавить десятки или сотни тысяч строк к большинству ваших скомпилированных файлов и могут вызвать частую перекомпиляцию многих источников. Это значительно усложняет процесс сборки: требования к процессору возрастают, потребление оперативной памяти возрастает, дисковый ввод-вывод возрастает… и снова, это становится все более серьезной проблемой по мере увеличения сложности ваших баз кода / проектов.