Frage

Ich habe viele Entwickler gesehen, dass verschiedene Convenience-Makros zum Prefix.pch ihrer iOS-Projekte hinzuzufügen.

Was tun (oder nicht), die Sie empfehlen, indem auf die iOS Prefix.pch-Datei? Wie sieht Ihre Prefix.pch aussehen?

War es hilfreich?

Lösung

Ewww ... platziere Makros nicht in einer PCH-Datei! Eine PCH-Datei ist per definitionem eine projektspezifische vorkompilierte Header. Es sollte wirklich nicht über den Rahmen des Projekts verwendet werden, und es sollte wirklich nicht alles andere als #includes und #imports enthalten.

Wenn Sie einige Makros und so, dass man zwischen den Kopf teilen möchten, dann haften sie in einer Header-Datei ihrer eigenen - Common.h oder was auch immer - und #include , die am Anfang der. pch.

Andere Tipps

Für moderne iOS und OS X, die Menschen sollten verwenden Module . Dies ist standardmäßig für neue Projekte aktiviert und Importieren / Aufnahme wird unter Verwendung von @import erreicht.

Module ermöglicht den Compiler eine Zwischendarstellung des Inhalts eines Moduls zu erzeugen (beispielsweise einen Rahmen der Header). Ähnlich wie ein PCH, diese Zwischendarstellung kann über mehrere Übersetzungen geteilt werden. Aber Module nimmt einen Schritt weiter, weil ein Modul nicht unbedingt Ziel spezifisch ist, und ihre Erklärungen lokalisiert werden müssen, nicht (in *.pch). Diese Darstellung kann man eine Tonne redundante Compiler Arbeit speichern.

Mit Modulen, Sie brauchen kein PCH, und Sie sollten wahrscheinlich nur vollständig mit ihnen tun, weg - für @import lokal für die Abhängigkeit verwendet wird. In diesem Fall wird nur ein PCH spart man von Eingabe Einschlüsse lokale Abhängigkeiten (die IMO sollten Sie ohnehin tun).

Wenn wir nun auf die ursprüngliche Frage zurückblicken: Sie sollten Ihre PCH mit allerlei zufälligen Dinge vermeiden füllt; Makros, Konstanten, #defines, und alle Arten von kleinen Bibliotheken. Im Allgemeinen sollten Sie auslassen, was wirklich nicht notwendig ist, um die Mehrheit der Quelldateien . Putting alle möglichen Sachen in Ihrem PCH ist das Hinzufügen von nur ein paar Gewicht und Abhängigkeit. Ich sehe Menschen, alles setzen sie verknüpfen und mehr in der PCH. In Wirklichkeit müssen Hilfsrahmen der Regel nur auf wenige Übersetzungen in den meisten Fällen sichtbar sein. Z.B. „Hier ist unsere StoreKit Sachen - lassen Sie sich Import StoreKit nur dort, wo es Muss sichtbar seine Insbesondere diese drei Übersetzungen.“. Das hält Ihre Bauzeiten nach unten, und hilft Ihnen, den Überblick über Ihre Abhängigkeiten zu halten, so dass Sie Code leichter wiederverwenden können. So in einem ObjC Projekt, würden Sie in der Regel bei Stiftung stoppen. Wenn es eine Menge von UI ist, dann könnten Sie zu Ihrem PCH Hinzufügen UIKit oder AppKit betrachten. Dies alles vorausgesetzt, Sie Bauzeiten optimieren möchten. Eines der Probleme, mit großen PCHs, die (fast) alles ist, dass unnötige Abhängigkeiten zu entfernen sehr zeitaufwendig ist. Sobald Abhängigkeiten Ihres Projekts wachsen und Ihre Bauzeiten steigen, müssen Sie durch unnötige Abhängigkeiten, um Ihre Bauzeiten zu verringern, zu bekämpfen. Auch alles, was sich häufig ändern sollte in der Regel aus Ihrem PCH gehalten werden. Eine Änderung erfordert eine vollständige wieder aufzubauen. Es gibt einige Optionen auf Aktien PCHs. Wenn Sie PCHs verwenden, zielen auf Unterstützung Sharing.

Soweit, was ich in meinem PCH setzen: hörte ich sie für die überwiegende Mehrheit der Ziele Jahre mit vor. Es ist nur in der Regel nicht genug gemeinsam zu qualifizieren. Beachten Sie, ich schreibe C ++, ObjC, ObjC ++ und C - die Compiler gibt eine für jede lang in Ihr Ziel. So ermöglichen sie führen oft in langsamen Kompilierung Zeiten und höheren I / O. Letztlich Abhängigkeit zu erhöhen, ist kein guter Weg, die Abhängigkeit in komplexen Projekten zu kämpfen. Arbeiten mit mehreren Sprachen / Dialekte gibt es viel Variation in den für eine bestimmte Ziel erforderlichen Abhängigkeiten. Nein, ich würde nicht raten, dass als optimal für jedes Projekt, aber das eine Perspektive zu Abhängigkeitsmanagement in größeren Projekten nicht geben.


Referenzen


Notizen

  • Diese Frage wurde gebeten, ursprünglich ein paar Jahre vor Module Einführung.
  • Derzeit (Xcode 5.0), Module arbeiten für C und ObjC, aber nicht C ++.

Ich bin mit BBUM. Mein Nehmen auf der PCH-Datei ist, dass es so ziemlich nur #include oder #import Aussagen enthalten sollte. Also, wenn Sie eine Reihe hilfreicher, High-Level-Makros haben, definieren sie in so etwas wie Common.h und #import diese Datei, wie BBUM vorgeschlagen.

Normalerweise gehe ich einen Schritt weiter und verwenden Sie die PCH-Datei eine Datei namens #import XXCategories.h (wo XX ist die Klasse Naming Präfix Konvention Sie verwenden), die #imports für alle meine UIKit und Foundation Klassenkategorien enthält: NSString+XXAdditions.h, UIColor+XXAdditons.h usw.

erstellen Sie eine Header-Datei "macros.h"

importieren diesen Header in Prefix.pch

In diesem macros.h Legen Sie alle Frameworks und andere wichtige Dinge.

Wenn Sie über die Leistung besorgt sind, keine Sorge, sehen, was Apple sagt:

Kopf- und Leistung

  

Wenn Sie sind besorgt, dass eine Master-Header-Datei einschließlich verursachen kann Ihre   Programm aufblasen, keine Sorge. Da OS X Schnittstellen implementiert   Verwendung von Gerüsten, residiert der Code für diese Schnittstellen in einem dynamischen   gemeinsam benutzte Bibliothek und nicht in der ausführbaren Datei. Darüber hinaus wird nur der Code   von Ihrem Programm verwendet wird, immer in dem Speicher zur Laufzeit geladen, so dass Ihr   In-Memory bleibt Fußabdruck ähnlich klein.         Wie für eine große Anzahl von Header-Dateien während der Kompilierung einschließlich, noch einmal, keine Sorge. Xcode bietet eine vorkompilierte   Kopf Einrichtung Kompilierungszeiten zu beschleunigen. Durch die Zusammenstellung all der   Rahmen-Header auf einmal, gibt es keine Notwendigkeit, die Header neu kompilieren   es sei denn, Sie einen neuen Rahmen hinzufügen. In der Zwischenzeit können Sie mit jedem   Schnittstelle von dem mitgelieferten Rahmen mit wenig oder gar keiner Leistung   Strafe.

auch in meinem macros.h habe ich eine Menge von Konstanten wie:

// delegate
#define UIAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]
#define APPDELEGATE   ((AppDelegate *)[[UIApplication sharedApplication] delegate])

// system
#define IS_IPHONE_4INCH (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height==568)
#define IS_IPAD                     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

// screen size
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
#define IS_RETINA_DISPLAY ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
#define IS_PORTRAIT                 UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])
#define IS_LANDSCAPE                UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])

//system version
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

// math
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

// cores
#define RGB(r,g,b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
#define MAKECOLOR(R, G, B, A) [UIColor colorWithRed:((float)R/255.0f) green:((float)G/255.0f) blue:((float)B/255.0f) alpha:A]
#define MAKECOLORFROMHEX(hexValue) [UIColor colorWithRed: ((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]



//customizations
#define SHOW_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
#define HIDE_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

#define SHOW_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:FALSE];
#define HIDE_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:TRUE];

#define VC_OBJ(x) [[x alloc] init]
#define VC_OBJ_WITH_NIB(x) [[x alloc] initWithNibName : (NSString *)CFSTR(#x) bundle : nil]

#define RESIGN_KEYBOARD [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

#define CLEAR_NOTIFICATION_BADGE                       [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
#define REGISTER_APPLICATION_FOR_NOTIFICATION_SERVICE  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]

#define HIDE_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
#define SHOW_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top