Для современных iOS и OS X люди должны использовать Модули . Это включено по умолчанию для новых проектов, а импорт / включение выполняется с помощью @import
.
Модули позволяют компилятору создавать промежуточное представление содержимого модуля (например, заголовки фреймворка). Подобно PCH, это промежуточное представление может быть общим для нескольких переводов. Но модули делают этот шаг еще дальше, потому что модуль не обязательно ориентирован на конкретную цель, и их объявления не должны быть локализованы (до *.pch
). Это представление может сэкономить вам массу работы компилятора.
При использовании модулей вам не нужен PCH, и вам, вероятно, следует просто покончить с ними - в пользу использования @import
локально по отношению к зависимости. В этом случае PCH спасает вас только от ввода включений, локальных по отношению к зависимостям (какой IMO вы должны делать в любом случае).
Теперь, если мы вернемся к первоначальному вопросу: вам следует избегать наполнения вашего PCH всевозможными случайными вещами; Макросы, константы, #defines
и всякие маленькие библиотеки. Как правило, вы должны опускать то, что действительно не нужно для большинства ваших исходных файлов . Поместить все виды вещей в ваш PCH - это просто добавить вес и зависимость. Я вижу, что люди помещают все, что они связывают и больше в PCH. В действительности, вспомогательные структуры обычно должны быть видны только нескольким переводам в большинстве случаев. Например. «Вот наш материал StoreKit - давайте импортировать StoreKit только там, где он должен быть видимым. В частности, эти 3 перевода». Это сокращает время сборки и помогает отслеживать ваши зависимости, чтобы вам было проще повторно использовать код. Поэтому в проекте ObjC вы обычно останавливаетесь в Foundation. Если пользовательского интерфейса много, то вы можете рассмотреть возможность добавления UIKit или AppKit к вашему PCH. Это все, если вы хотите оптимизировать время сборки. Одна из проблем с большими PCH, которые включают (почти) все, состоит в том, что удаление ненужных зависимостей занимает очень много времени. Как только зависимости вашего проекта растут, а время сборки увеличивается, вам нужно дать отпор, удалив ненужные зависимости, чтобы сократить время сборки. Кроме того, все, что часто меняется, должно храниться вне вашего PCH. Изменение требует полной перестройки. Есть несколько вариантов обмена PCH. Если вы используете PCH, постарайтесь поддержать совместное использование.
Что касается того, что я положил в свой PCH: я перестал использовать их для подавляющего большинства целей много лет назад. Там просто обычно не хватает общего, чтобы претендовать. Имейте в виду, я пишу C ++, ObjC, ObjC ++ и C - компилятор выдает один для каждого языка в вашей цели. Поэтому их включение часто приводило к снижению времени компиляции и увеличению числа операций ввода-вывода. В конечном счете, увеличение зависимости не является хорошим способом борьбы с зависимостью в сложных проектах. Работая с несколькими языками / диалектами, существует много различий в зависимостях, необходимых для данной цели. Нет, я бы не советовал это как оптимальное для каждого проекта, но это дает некоторую перспективу управления зависимостями в более крупных проектах.
Ссылки
Примечания
- Этот вопрос первоначально задавался за несколько лет до введения модулей.
- В настоящее время (Xcode 5.0) модули работают для C и ObjC, но не для C ++.