Чому ProjectName-Prefix.pch не створюється автоматично в Xcode 6?


264

Чому не ProjectName-Prefix.pchстворено автоматично в Xcode 6?

Чи заголовок прекомпіляції більше не потрібен?

Де мені написати код, який був ProjectName-Prefix.pchраніше?

Відповіді:


136

Я підозрюю, що через модулі, які усувають потребу в #import <Cocoa/Cocoa.h>.

Щодо того, куди слід поставити код, який ви б помістили в заголовок префікса, немає коду, який слід помістити в заголовок префікса. Помістіть свій імпорт у потрібні файли. Покладіть свої визначення у власні файли. Покладіть макроси ... нікуди. Не припиняйте писати макроси, якщо немає іншого способу (наприклад, коли вам потрібно __FILE__). Якщо вам потрібні макроси, покладіть їх у заголовок і включіть його.

Заголовок префікса був необхідний для величезних речей, які використовуються майже всім у всій системі (як Foundation.h). Якщо у вас є щось таке величезне і всюдисуще, ви повинні переосмислити свою архітектуру. Префіксні заголовки ускладнюють повторне використання коду та вводять тонкі проблеми в збірці, якщо будь-який із перелічених файлів може змінитися. Уникайте їх, поки у вас не виникне серйозна проблема з часом складання, яку ви зможете продемонструвати, значно покращившись із заголовком префікса.

У такому випадку ви можете створити його і передати його в кланг, але це надзвичайно рідко, що це гарна ідея.


РЕДАКТУВАННЯ: До вашого конкретного запитання щодо HUD, який ви використовуєте у всіх своїх контролерах перегляду, так, вам слід абсолютно імпортувати його у кожен контролер перегляду, який фактично його використовує. Це робить зрозумілі залежності. Коли ви повторно використовуєте свій контролер перегляду в новому проекті (що є звичайним, якщо ви добре побудуєте контролери), ви відразу дізнаєтесь, що йому потрібно. Це особливо важливо для категорій, які можуть зробити код дуже важким для повторного використання, якщо вони неявні.

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


102
@Rob ваша відповідь суб'єктивна розпуста. Я не згоден, це слід сприймати як відповідь на це питання. Як би ви реалізували щось подібне до цього 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. За допомогою параметра Налаштування збірки цілі встановіть значення заголовка префіксу на ім'я файлу PCH, а назва проекту - як префікс (тобто для імені проекту TestProjectта імені файлу PCH MyPrefixHeaderFile, додайте значення TestProject/MyPrefixHeaderFile.pchдо списку).

    ПОРАДА: Ви можете використовувати такі речі, як, $(SRCROOT)або, $(PROJECT_DIR)щоб дістатися до шляху, куди ви ставите .pchпроект.

  3. За допомогою параметра Налаштування збірки цілі встановіть значення заголовка префіксації прекомпіляції на YES.


32
Незважаючи на мою думку щодо файлів PCH, +1. Людям все ще корисно знати, як користуватися інструментами.
Роб Нап’єр

20
@ Yedidya, я просто хотів сказати коротку подяку за те, що ви знайшли час для повідомлення відповіді на питання, незважаючи на те, які судження у вас є щодо цього. Я вдячний, коли люди знаходять час, щоб сердечно відповідати на питання, а не просто лаяти людину про те, наскільки це погано порадили питання.
campo

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
Алехандро Іван

Якщо ви зберігаєте .pch файл у конкретній папці, тоді виникла ситуація.
Пракаш Радж

51

Я покажу вам картинку!

  1. Додати новий файл Додати новий файл

  2. Перейдіть до Налаштування проекту / побудови / APPl LLVM 6.0-Мова Додати новий файл


24

Щоб додати .pch файл-

1) Додайте новий .pch файл у свій проект-> Новий файл-> інший-> файл PCH

2) Перейдіть у налаштування проекту.

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

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

5) Очистіть і побудуйте проект. Це воно!!!

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


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

Щоб додати новий файл PCH, виконайте наведені нижче дії:

(1) Додати нову програму - Виберіть iOS - інше та файл PCH

(2) додати шлях до цього файлу PCH до свого проекту - BuildSetting - Apple LLVM 6.0 Language

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


Ласкаво поясніть останній. Додати шлях встановлення префікса заголовок.
Naveed Abbas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.