Question

J'ai vu de nombreux développeurs qui ajoutent différentes macros ci à l'Prefix.pch de leurs projets iOS.

Que faire (ou ne pas) vous est recommandé d'ajouter au fichier Prefix.pch iOS? A quoi ressemble votre Prefix.pch comme?

Était-ce utile?

La solution

Beurk ... ne macros pas mis dans un fichier .pch! Un fichier .pch est, par définition, un en-tête précompilé spécifique du projet. Il ne devrait vraiment pas être utilisé au-delà du cadre du projet et il ne devrait vraiment pas contenir quoi que ce soit, mais #includes et #imports.

Si vous avez des macros et ce que vous souhaitez partager entre les en-têtes, puis coller « em dans un fichier d'en-tête de leur propre - Common.h ou autre - et #include que au début du. pch.

Autres conseils

Pour iOS moderne et OS X, les gens devraient utiliser Modules . Cette option est activée par défaut pour les nouveaux projets, et l'importation / l'inclusion est effectuée en utilisant @import.

modules permettent le compilateur pour créer une représentation intermédiaire du contenu d'un module (par exemple, un en-têtes de cadres). Tout comme un PCH, cette représentation intermédiaire peut être partagée entre plusieurs traductions. Mais les modules prennent un peu plus loin parce qu'un module n'est pas nécessairement spécifique cible, et leurs déclarations ne doit pas être localisé (à un *.pch). Cette représentation peut vous faire économiser un travail de compilateur redondant tonnes.

Utilisation de modules, vous n'avez pas besoin de PCH, et vous devriez probablement faire avec eux entièrement - en faveur de l'utilisation @import locale à la dépendance. Dans ce cas, une PCH est vous seul point de taper inclusions locales aux dépendances (OMI que vous devriez faire de toute façon).

Maintenant, si nous regardons en arrière à la question initiale: Vous devriez éviter de remplir votre PCH avec toutes sortes de choses au hasard; Macros, des constantes, #defines, et toutes sortes de petites bibliothèques. En règle générale, vous devriez omettent ce qui est vraiment nécessaire à la majorité de vos fichiers source . Mettre toutes sortes de choses dans votre PCH est simplement l'ajout d'un groupe de poids et de la dépendance. Je vois des gens qui mettent tout ce qu'ils contiennent un lien et plus dans la PCH. En réalité, les cadres auxiliaires doivent généralement seulement être visible à quelques traductions dans la plupart des cas. Par exemple. "Voici notre truc de StoreKit - le StoreKit d'importation let que si elle doit visible Plus précisément, ces 3 traductions.". Cela permet de maintenir votre temps de construction vers le bas, et vous aide à garder une trace de vos dépendances, de sorte que vous pouvez réutiliser le code plus facilement. Ainsi, dans un projet ObjC, vous habituellement arrêter à la Fondation. S'il y a beaucoup d'assurance-chômage, alors vous pourriez envisager d'ajouter UIKit ou AppKit à votre PCH. Ceci est tout ce que vous supposant que vous voulez optimiser les temps de construction. L'un des problèmes avec les grands FSP qui comprennent (presque) tout est que la suppression des dépendances inutiles est temps. Une fois que votre dépendances de projet grandir et vos temps de construction augmentent, vous avez besoin de se battre en éliminant les dépendances inutiles afin de réduire votre temps de construction. En outre, tout ce qui change souvent devrait généralement être gardé hors de votre PCH. Un changement nécessite une reconstruction complète. Il y a quelques options pour partager FSP. Si vous utilisez FSP, ne visent le partage de soutien.

En ce qui concerne ce que je mets dans mon PCH: je me suis arrêté de les utiliser pour la grande majorité il y a des cibles années. Il est juste généralement pas assez en commun pour se qualifier. Gardez à l'esprit, j'écris C ++, ObjC, ObjC ++ et C - le compilateur émet un pour chaque lang dans votre cible. Donc, ce qui leur permet souvent donné lieu à des temps de compilation plus lentes et d'E / S plus élevé. En fin de compte, la dépendance croissante est pas une bonne façon de lutter contre la dépendance à des projets complexes. Travailler avec plusieurs langues / dialectes, il y a une grande variation dans les dépendances nécessaires pour une cible donnée. Non, je ne conseillerais pas que comme la solution optimale pour chaque projet, mais cela ne donne une certaine perspective à la gestion de la dépendance dans les grands projets.


Références


Remarques

  • Cette question a été posé quelques années avant l'introduction de modules.
  • À l'heure actuelle (Xcode 5.0), les modules travaillent pour C et ObjC, mais pas C ++.

Je suis d'accord avec bbum. Mon point de vue sur le fichier PCH est qu'il doit contenir à peu près que des déclarations de #include ou #import. Donc, si vous avez un tas de macros utiles, de haut niveau, les définir quelque chose comme Common.h et #import ce fichier, comme le suggère bbum.

Je vais habituellement un peu plus loin et d'utiliser le fichier PCH pour #import un fichier appelé XXCategories.h (où XX est la convention de préfixe de nommage des classes que vous utilisez) qui contient #imports toute ma UIKit et la Fondation catégories de classe: NSString+XXAdditions.h, UIColor+XXAdditons.h, etc.

créer un fichier d'en-tête "macros.h"

importer cet en-tête dans Prefix.pch

Dans ce macros.h mettre tous les cadres et d'autres choses importantes.

Si vous êtes inquiet au sujet de la performance, ne vous inquiétez pas, regardez ce que Apple dit:

En-têtes et performance

  

Si vous craignez que d'inclure un fichier d'en-tête maître peut causer votre   programme de ballonnement, ne vous inquiétez pas. Parce que les interfaces OS X sont mises en œuvre   en utilisant des cadres, le code pour les interfaces réside dans une dynamique   bibliothèque partagée et non dans votre exécutable. En outre, seul le code   utilisé par votre programme est toujours chargé en mémoire lors de l'exécution, de sorte que votre   en mémoire l'empreinte reste aussi faible.         En ce qui concerne notamment un grand nombre de fichiers d'en-tête lors de la compilation, encore une fois, ne vous inquiétez pas. Xcode fournit un précompilé   installation d'en-tête pour accélérer les temps de compilation. En compilant toutes les   têtes cadres à la fois, il n'y a pas besoin de recompiler les en-têtes   sauf si vous ajoutez un nouveau cadre. En attendant, vous pouvez utiliser   l'interface des cadres inclus avec peu ou pas de performance   pénalité.

aussi dans mon macros.h j'ai mis beaucoup de constantes comme:

// 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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top