Warum wird ProjectName-Prefix.pch in Xcode 6 nicht automatisch erstellt?


264

Warum wird nicht ProjectName-Prefix.pchautomatisch in erstelltXcode 6 ?

Wird der vorkompilierte Header nicht mehr benötigt?

Wo soll ich den Code schreiben, der ProjectName-Prefix.pchvorher war?

Antworten:


136

Ich vermute wegen Modulen, die die Notwendigkeit für die beseitigen #import <Cocoa/Cocoa.h> .

In Bezug darauf, wo Code eingefügt werden soll, den Sie in einen Präfix-Header einfügen würden, gibt es keinen Code, den Sie in einen Präfix-Header einfügen sollten. Fügen Sie Ihre Importe in die Dateien ein, die sie benötigen. Fügen Sie Ihre Definitionen in ihre eigenen Dateien ein. Platziere deine Makros ... nirgendwo. Hören Sie auf, Makros zu schreiben, es sei denn, es gibt keinen anderen Weg (z. B. bei Bedarf)__FILE__ ). Wenn Sie Makros benötigen, fügen Sie diese in eine Kopfzeile ein und fügen Sie sie ein.

Der Präfix-Header war für Dinge erforderlich, die riesig sind und von fast allem im gesamten System verwendet werden (z Foundation.h ). Wenn Sie etwas haben, das so groß und allgegenwärtig ist, sollten Sie Ihre Architektur überdenken. Präfix-Header erschweren die Wiederverwendung von Code und führen zu subtilen Build-Problemen, wenn sich eine der aufgelisteten Dateien ändern kann. Vermeiden Sie sie, bis Sie ein ernstes Problem mit der Erstellungszeit haben, von dem Sie nachweisen können, dass es durch einen Präfix-Header erheblich verbessert wird.

In diesem Fall können Sie eine erstellen und in Clang übergeben, aber es ist unglaublich selten, dass dies eine gute Idee ist.


BEARBEITEN: Auf Ihre spezielle Frage zu einem HUD, das Sie in all Ihren View-Controllern verwenden, sollten Sie es unbedingt in jeden View-Controller importieren, der es tatsächlich verwendet. Dies macht die Abhängigkeiten klar. Wenn Sie Ihren View Controller in einem neuen Projekt wiederverwenden (was häufig der Fall ist, wenn Sie Ihre Controller gut erstellen), wissen Sie sofort, was erforderlich ist. Dies ist besonders wichtig für Kategorien, die die Wiederverwendung von Code sehr schwierig machen können, wenn sie implizit sind.

Die PCH-Datei ist nicht dazu da, Abhängigkeiten aufzulisten. Sie sollten weiterhin importieren UIKit.hoder Foundation.hnach Bedarf, wie es die Xcode-Vorlagen tun. Der Grund für den PCH ist die Verbesserung der Build-Zeiten beim Umgang mit wirklich massiven Headern (wie in UIKit).


102
@ Rob deine Antwort ist subjektiv schimpfen. Ich bin nicht der Meinung, dass dies als Antwort auf diese Frage akzeptiert werden sollte. Wie würden Sie so etwas wie dieses umzusetzen github.com/seancook/TWReverseAuthExample/blob/... ohne pch? Das Protokoll in jede einzelne Datei importieren? Dies erzeugt einen ganzen Haufen unnötiger Aufblähungen in Ihrem Code.
Maxim Veksler

26
Jede Datei, die dieses Makro tatsächlich verwendet, ja (meiner Erfahrung nach ist dies normalerweise weniger als jede Datei im System). Dies ist ein sehr gutes Beispiel für meinen Standpunkt. Durch das Importieren wird implizit die Tatsache maskiert, dass Sie von diesem Protokollierungsmakro abhängig sind. Wenn Sie beispielsweise versuchen TWAPIManager.m, in ein anderes Projekt zu kopieren , werden Fehler angezeigt, TWALog()die nicht definiert sind und keinen Hinweis darauf enthalten, wo sie zu finden sind. Ich habe genau dieses Problem bei mehreren großen Projekten festgestellt, die versucht haben, Code gemeinsam zu nutzen. Das Erstellen TWAPILog.hund Importieren löst dies mit geringfügigen Entwicklungskosten.
Rob Napier

5
Ich benutze ReactiveCocoa in fast jeder Klasse, es wäre verrückt für mich, keine PCH-Datei zu verwenden ...
Stefano Mondino

2
Nicht nur Module, sondern auch schnelle Unterstützung ist wahrscheinlich ein großes Stück.
Uchuugaka

12
Der Schlüssel ist, dass PCH ein vorkompilierter Header ist . Die Vorkompilierung dient der Build-Leistung und nicht der automatischen Verfügbarkeit. Die Vorkompilierung bietet verschiedene Möglichkeiten, um Ihren Build durcheinander zu bringen, und sollte für große Dinge reserviert werden, die sich zwischen nicht sauberen Builds (wie Foundation) nie ändern.
Rob Napier

425

Ohne die Frage, ob es richtig ist oder nicht, können Sie die PCH-Datei manuell hinzufügen:

  1. Fügen Sie dem Projekt eine neue PCH-Datei hinzu: Neue Datei> Andere> PCH-Datei .

  2. Zu dem wichtigsten Ziel Build - Einstellungen Option, den Wert der Präfix - Header auf Ihren PCH Dateinamen, mit dem Projektnamen als Präfix (dh für Projekt mit dem Namen TestProjectund PCH Datei mit dem Namen MyPrefixHeaderFile, fügen Sie den Wert TestProject/MyPrefixHeaderFile.pchin die plist).

    TIPP: Sie können Dinge wie $(SRCROOT)oder verwenden $(PROJECT_DIR), um zu dem Pfad zu gelangen, in den Sie .pchdas Projekt eingefügt haben.

  3. Zu dem wichtigsten Ziel Build - Einstellungen Option, den Wert von Precompile Präfix - Header zu YES.


32
Trotz meiner Meinung zu PCH-Dateien +1. Es ist immer noch nützlich, zu wissen, wie man die Werkzeuge benutzt.
Rob Napier

20
@Yedidya, ich wollte mich nur kurz dafür bedanken, dass Sie sich die Zeit genommen haben, die Antwort auf die Frage zu kommunizieren, trotz aller Urteile, die Sie darüber haben. Ich weiß es zu schätzen, wenn sich die Leute die Zeit nehmen, Fragen herzlich zu beantworten, anstatt nur die Person darüber zu beschimpfen, wie schlecht die Frage beraten ist.
Campo

3
Vielen Dank. Ich finde es nützlich, wenn ich einige meiner Objective-C in ein Swift-Projekt einbinde, damit ich nicht zurückgehen und jeder dieser .m-Dateien eine Reihe von Include-Dateien hinzufügen muss.
Chris Prince

Sehr praktisch beim Übergang von ObjC zu Swift - Ich habe einen Haufen Bibliotheken in ObjC geschrieben und das Letzte, was ich tun möchte, ist, alle so zu bearbeiten, dass sie die richtigen Systemheader enthalten.
Echelon

1
Dies hat bei mir nicht funktioniert, da ich die Build-Einstellungen des Ziels verwendet habe. Als ich diesen Anweisungen folgte, änderte ich stattdessen die Einstellungen für die Projekterstellung.
Pauls

128

Sie müssen eine eigene PCH-Datei
hinzufügenNew file -> Other-> PCH file

Fügen Sie dann den Pfad dieser PCH-Datei zu Ihrem Build hinzu setting->prefix header->path

($ (SRCROOT) /filename.pch)

Geben Sie hier die Bildbeschreibung ein


3
Nun, je nach Arbeitsverzeichnis können die Variablen variieren. Ich benutze$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván

Wenn Sie die .pch-Datei in dem bestimmten Ordner behalten, ist die Situation aufgetreten.
Prakash Raj

51

Ich zeige es dir mit einem Bild!

  1. Fügen Sie eine neue Datei hinzu Fügen Sie eine neue Datei hinzu

  2. Gehen Sie zu Project / Build Setting / APPl LLVM 6.0-Language Fügen Sie eine neue Datei hinzu


24

So fügen Sie eine .pch-Datei hinzu:

1) Fügen Sie Ihrem Projekt eine neue .pch-Datei hinzu-> Neue Datei-> andere-> PCH-Datei

2) Wechseln Sie zur Build-Einstellung Ihres Projekts.

3) Suchen Sie nach "Präfix-Header". Sie finden das unter Apple LLVM.

4) Fügen Sie dies in das Feld ein $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Reinigen und bauen Sie das Projekt. Das ist es!!!

Geben Sie hier die Bildbeschreibung ein


12

Wenn Sie eine .pch-Datei manuell hinzufügen möchten und Objective-C wie vor xCode 6 verwenden möchten, müssen Sie auch UIKit- und Foundation-Frameworks in die .pch-Datei importieren. Andernfalls müssen Sie diese Frameworks manuell in jede Header-Datei importieren. Sie können den folgenden Code trotzdem hinzufügen, wenn er die verwendete Sprache testet:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

2
Alles, was ObjC-Code beinhaltet, muss in das obige #ifdef _ OBJC _ eingeschlossen werden, sonst erhalten Sie Fehler von C-Quellen (falls Sie solche Quellen haben), die Sie nie verstehen werden
ishahak

7

Verwenden :

$ (PROJECT_DIR) / Projektname / PrefixHeader.pch


1
Gibt es eine $ -Erklärung für "Projektname"?
Amit

7

Führen Sie die folgenden Schritte aus, um eine neue PCH-Datei hinzuzufügen:

(1) Neue Ansicht hinzufügen - Wählen Sie iOS - Andere und PCH-Datei

(2) Fügen Sie den Pfad dieser PCH-Datei zu Ihrer Project - BuildSetting - Apple LLVM 6.0-Sprache hinzu

Add Set Prefix Header Path YourApplicationName (Root-Pfad) /filename.pch


Bitte erklären Sie den letzten. Fügen Sie den Headerpfad für den festgelegten Präfix hinzu.
Naveed Abbas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.