Ich habe viele Entwickler gesehen, die der Prefix.pch ihrer iOS-Projekte verschiedene Komfortmakros hinzufügen.
Was empfehlen Sie (oder nicht), um es zur Datei iOS Prefix.pch hinzuzufügen? Wie sieht Ihre Prefix.pch aus?
ios
objective-c
xcode
pch
hpique
quelle
quelle
Macros.h
und importieren Sie diese Datei in Ihreprefix.pch
.Antworten:
Ewww… füge keine Makros in eine .pch-Datei ein! Eine .pch-Datei ist per Definition ein projektspezifischer vorkompilierter Header. Es sollte wirklich nicht über den Kontext des Projekts hinaus verwendet werden und es sollte wirklich nichts anderes als
#include
s und#import
s enthalten.Wenn Sie einige Makros haben und solche, die Sie zwischen Headern teilen möchten, stecken Sie sie in eine eigene Header-Datei -
Common.h
oder was auch immer - und#include
das am Anfang der .pch.quelle
Für modernes iOS und OS X sollten Benutzer Module verwenden . Dies ist standardmäßig für neue Projekte aktiviert, und der Import / Einschluss erfolgt mithilfe von
@import
.Mit Modulen kann der Compiler eine Zwischendarstellung des Inhalts eines Moduls erstellen (z. B. die Header eines Frameworks). Ähnlich wie bei einem PCH kann diese Zwischendarstellung von mehreren Übersetzungen gemeinsam genutzt werden. Module gehen jedoch noch einen Schritt weiter, da ein Modul nicht unbedingt zielspezifisch ist und ihre Deklarationen nicht lokalisiert werden müssen (zu a
*.pch
). Diese Darstellung kann Ihnen eine Menge redundanter Compilerarbeit ersparen.Wenn Sie Module verwenden, benötigen Sie keinen PCH, und Sie sollten sie wahrscheinlich ganz weglassen - zugunsten der Verwendung von
@import
local für die Abhängigkeit. In diesem Fall erspart Ihnen ein PCH nur die Eingabe lokaler Einschlüsse für Abhängigkeiten (welche IMO Sie sowieso ausführen sollten).Wenn wir jetzt auf die ursprüngliche Frage zurückblicken: Sie sollten vermeiden, Ihren PCH mit allen möglichen zufälligen Dingen zu füllen. Makros, Konstanten
#defines
und alle möglichen kleinen Bibliotheken. Im Allgemeinen sollten Sie weglassen, was für die meisten Ihrer Quelldateien wirklich unnötig ist . Wenn Sie alle möglichen Dinge in Ihren PCH aufnehmen, wird nur eine Menge Gewicht und Abhängigkeit hinzugefügt. Ich sehe, dass Leute alles, was sie verknüpfen, und mehr in den PCH stellen. In der Realität müssen Hilfsrahmen in den meisten Fällen nur für wenige Übersetzungen sichtbar sein. ZB "Hier ist unser StoreKit-Zeug - lasst uns StoreKit nur dort importieren, wo es musssei sichtbar. Insbesondere diese 3 Übersetzungen ". Dies hält Ihre Erstellungszeiten niedrig und hilft Ihnen, Ihre Abhängigkeiten im Auge zu behalten, sodass Sie Code leichter wiederverwenden können. In einem ObjC-Projekt würden Sie normalerweise bei Foundation anhalten. Wenn es viel gibt In der Benutzeroberfläche können Sie UIKit oder AppKit zu Ihrem PCH hinzufügen. Dies setzt voraus, dass Sie die Erstellungszeiten optimieren möchten. Eines der Probleme bei großen PCHs, die (fast) alles enthalten, besteht darin, dass das Entfernen unnötiger Abhängigkeiten sehr zeitaufwändig ist Wenn die Abhängigkeiten Ihres Projekts zunehmen und Ihre Erstellungszeiten steigen, müssen Sie sich wehren, indem Sie unnötige Abhängigkeiten beseitigen, um Ihre Erstellungszeiten zu verkürzen. Außerdem sollten alle Änderungen häufig aus Ihrem PCH herausgehalten werden. Eine Änderung erfordert eine vollständige Neuerstellung. Es gibt einige Optionen zum Freigeben von PCHs. Wenn Sie PCHs verwenden,Was ich in meinen PCH geschrieben habe: Ich habe sie vor Jahren für die überwiegende Mehrheit der Ziele nicht mehr verwendet. Es gibt normalerweise nicht genug Gemeinsamkeiten, um sich zu qualifizieren. Denken Sie daran, ich schreibe C ++, ObjC, ObjC ++ und C - der Compiler gibt eine für jede Sprache in Ihrem Ziel aus. Ihre Aktivierung führte daher häufig zu langsameren Kompilierungszeiten und höheren E / A. Letztendlich ist eine zunehmende Abhängigkeit kein guter Weg, um die Abhängigkeit in komplexen Projekten zu bekämpfen. Bei der Arbeit mit mehreren Sprachen / Dialekten gibt es große Unterschiede in den Abhängigkeiten, die für ein bestimmtes Ziel erforderlich sind. Nein, ich würde nicht empfehlen, dass dies für jedes Projekt optimal ist, aber dies gibt dem Abhängigkeitsmanagement in größeren Projekten eine gewisse Perspektive.
Verweise
Anmerkungen
quelle
#import "MyLib/MyLib.h"
.MyLib.h
Jedes Mal, wenn eine Datei Änderungen enthält, muss jede Quelldatei in der App neu kompiliert werden. Wenn Sie MyLib in nur einer Quelldatei verwenden, muss nur diese Datei neu kompiliert werden, wenn sich MyLib ändert. Ob Sie es glauben oder nicht, ich verwende derzeit keine PCH-Dateien.Ich stimme bbum zu. Mein Nehmen auf der PCH - Datei ist , dass es ziemlich viel nur enthalten soll
#include
oder#import
Aussagen. Also , wenn Sie eine Reihe hilfreicher, High-Level - Makros haben, definieren sie in so etwas wieCommon.h
und#import
diese Datei, wie BBUM vorgeschlagen.Normalerweise gehe ich einen Schritt weiter und verwenden Sie die PCH - Datei in
#import
eine Datei mit dem NamenXXCategories.h
(woXX
ist die Klassenbenennung Präfix Konvention Sie verwenden) , die enthält#import
s für alle meine UIKit und Foundation Klassenkategorien:NSString+XXAdditions.h
,UIColor+XXAdditons.h
usw.quelle
#import
und dem#import
direkten Importieren dieser Dateien ? Wären diese nicht gleich? Oder wirkt sich dies auf die Leistung aus?#import
und sein#include
.Erstellen Sie eine Header-Datei "macros.h"
Importieren Sie diesen Header in Prefix.pch
In dieses macros.h setzen Sie alle Frameworks und andere wichtige Dinge.
Wenn Sie sich Sorgen um die Leistung machen, machen Sie sich keine Sorgen, schauen Sie, was Apple sagt:
Header und Leistung
auch in meine macros.h habe ich viele Konstanten gesetzt wie:
quelle
#define async(...) dispatch_async(dispatch_get_main_queue(), __VA_ARGS__ )
... um Blöcke auf dem Haupt-Thread auszuführen:async(^{ self.someLabel.text = @":D"; });