Почему ProjectName-Prefix.pch не создается автоматически в Xcode 6?

264

Почему не ProjectName-Prefix.pchсоздается автоматически в Xcode 6?

Заголовок прекомпиляции больше не нужен?

Где я должен написать код, который был ProjectName-Prefix.pchраньше?

Вэй
источник

Ответы:

136

Я подозреваю, из-за модулей, которые устраняют необходимость в #import <Cocoa/Cocoa.h>.

Относительно того, куда поместить код, который вы бы поместили в заголовок префикса, нет кода, который вы должны поместить в заголовок префикса. Поместите свой импорт в файлы, которые нуждаются в них. Поместите ваши определения в свои файлы. Положи свои макросы ... никуда. Прекратите писать макросы, если нет другого пути (например, когда вам нужно __FILE__). Если вам нужны макросы, поместите их в заголовок и включите его.

Заголовок префикса был необходим для вещей, которые огромны и используются почти всем во всей системе (например Foundation.h). Если у вас есть что-то такое огромное и вездесущее, вы должны переосмыслить свою архитектуру. Заголовки префиксов затрудняют повторное использование кода и создают небольшие проблемы со сборкой, если любой из перечисленных файлов может измениться. Избегайте их до тех пор, пока у вас не возникнет серьезная проблема со временем сборки, которая, как вы можете продемонстрировать, значительно улучшена с помощью префиксного заголовка.

В этом случае вы можете создать его и передать в Clang, но это очень редко, что это хорошая идея.


РЕДАКТИРОВАТЬ: На ваш конкретный вопрос о HUD, который вы используете во всех ваших контроллерах представления, да, вы должны абсолютно импортировать его в каждый контроллер представления, который фактически использует его. Это проясняет зависимости. Когда вы повторно используете свой контроллер представления в новом проекте (что часто случается, если вы хорошо строите свои контроллеры), вы сразу же узнаете, для чего он нужен. Это особенно важно для категорий, которые могут затруднить повторное использование кода, если он неявный.

Файл PCH не предназначен для того, чтобы избавиться от списка зависимостей. Вы все равно должны импортировать UIKit.hили по Foundation.hмере необходимости, как это делают шаблоны Xcode. Причиной использования PCH является увеличение времени сборки при работе с действительно большими заголовками (как в UIKit).

Роб Нейпир
источник
102
@ Роб ваш ответ - субъективная напыщенная речь. Я не согласен, что это следует принять как ответ на этот вопрос. Как бы вы реализовали что-то вроде этого github.com/seancook/TWReverseAuthExample/blob/… без pch? Импортировать журнал в каждый файл? Это создает целую кучу ненужного раздувания в вашем коде.
Максим Векслер
26
Да, каждый файл, который на самом деле использует этот макрос (по моему опыту это обычно меньше, чем каждый файл в системе). Это очень хороший пример моей точки зрения. Его импорт неявно маскирует тот факт, что вы зависите от этого макроса журналирования. Когда вы попытаетесь скопировать TWAPIManager.m, например, в другой проект, вы получите ошибки, которые TWALog()не определены, без подсказки о том, где его найти. Я столкнулся именно с этой проблемой в нескольких крупных проектах, пытающихся поделиться кодом. Создание TWAPILog.hи импорт этого решает это с тривиальной стоимостью разработки.
Роб Нейпир
5
Я использую ReactiveCocoa почти во всех классах, для меня было бы безумием не использовать файл pch ...
Стефано Мондино
2
Не только модули, но и быстрая поддержка, вероятно, большая часть.
Учуугака
12
Ключ в том, что PCH - это предварительно скомпилированный заголовок . Предварительная компиляция предназначена для производительности сборки, а не для автоматической доступности. Предварительная компиляция представляет несколько способов испортить вашу сборку и должна быть зарезервирована для огромных вещей, которые никогда не меняются между не чистыми сборками (такими как Foundation).
Роб Нейпир
425

Без вопроса, правильно это или нет, вы можете добавить файл PCH вручную:

  1. Добавить новый файл PCH в проект: Новый файл> Другое> Файл PCH .

  2. В параметре « Настройки сборки» Target задайте в качестве значения заголовка префикса имя файла PCH с префиксом имени проекта (т. Е. Для имени проекта и имени TestProjectфайла PCH MyPrefixHeaderFileдобавьте значение TestProject/MyPrefixHeaderFile.pchв plist).

    СОВЕТ: Вы можете использовать такие вещи, как $(SRCROOT)или, $(PROJECT_DIR)чтобы попасть туда, куда вы положили .pchпроект.

  3. На целевой объекте Построить настройки опции, установите значение прекомпиляцию Префикс заголовок к YES.

Едида Рейсс
источник
32
Несмотря на мое мнение о файлах PCH, +1. Людям все еще полезно знать, как пользоваться инструментами.
Роб Нейпир
20
@Yedidya, я просто хотел бы поблагодарить вас за то, что вы нашли время, чтобы сообщить ответ на вопрос, несмотря на все ваши суждения по этому поводу. Я ценю, когда люди находят время, чтобы сердечно отвечать на вопросы, а не просто ругать человека за то, как плохо ему посоветовали вопрос.
Кампо
3
Спасибо. Я нахожу это полезным при включении некоторых моих Objective-C в проект Swift, поэтому мне не нужно возвращаться и добавлять кучу включаемых файлов в каждый из этих файлов .m.
Крис Принс
Очень удобно при переходе от ObjC к Swift - у меня есть куча библиотек, написанных на ObjC, и последнее, что я хочу сделать, это отредактировать все из них, чтобы включить правильные системные заголовки.
Эшелон
1
Это не сработало для меня, потому что я использовал настройки сборки цели. Однако, когда я следовал этой инструкции, изменив настройки сборки проекта, вместо этого все заработало.
Паулс
128

Вам нужно создать собственный файл PCH
ДобавитьNew file -> Other-> PCH file

Затем добавьте путь к этому файлу PCH в вашу сборку setting->prefix header->path

($ (SRCROOT) /filename.pch)

введите описание изображения здесь

Пракаш Радж
источник
3
Ну, в зависимости от рабочего каталога, переменные могут отличаться. Я использую$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Если вы держите файл .pch в определенной папке, то возникла ситуация.
Пракаш Радж
51

Я покажу вам фото!

  1. Добавить новый файл Добавить новый файл

  2. Зайдите в Проект / Настройка сборки / APPl LLVM 6.0-Language Добавить новый файл

Slemon
источник
24

Добавить .pch file-

1) Добавить новый файл .pch в ваш проект-> Новый файл-> Другой-> PCH-файл

2) Перейти к настройке сборки вашего проекта.

3) Поиск "префикс заголовка". Вы можете найти это под Apple LLVM.

4) Вставьте это в поле $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Очистить и построить проект. Это оно!!!

введите описание изображения здесь

Subham93
источник
12

Если вы решили добавить файл .pch вручную и хотите использовать Objective-C, как и в xCode 6, вам также придется импортировать UIKit и Foundation-фреймворки в файл .pch. В противном случае вам придется импортировать эти фреймворки вручную в каждый заголовочный файл. В любом случае вы можете добавить следующий код, так как он проверяет используемый язык:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
мгр
источник
2
Все, что включает в себя код ObjC, должно быть заключено в вышеупомянутый #ifdef _ OBJC _, в противном случае вы получите ошибки из источников C (если у вас есть такие источники), которые вы никогда не поймете
ishahak
7

Используйте:

$ (PROJECT_DIR) / Название проекта / PrefixHeader.pch

Араш Зейноддини
источник
1
Существует ли какое-либо объявление типа $ для «Название проекта» ??
Амит
7

Для добавления нового файла PCH выполните следующие шаги:

(1) Добавить новый fiew - Выбрать iOS - Другой и PCH файл

(2) добавить путь к этому файлу PCH в свой проект - BuildSetting - Apple LLVM 6.0 Language

Добавить заданный префикс заголовка пути YourApplicationName (root-path) /filename.pch

Хитеш Вагела
источник
Пожалуйста, объясните последний. Добавить заданный префикс заголовка пути.
Навид Аббас