J'ai vu de nombreux développeurs ajouter diverses macros pratiques au Prefix.pch de leurs projets iOS.
Que recommandez-vous (ou non) d'ajouter au fichier iOS Prefix.pch? À quoi ressemble votre Prefix.pch?
ios
objective-c
xcode
pch
hpique
la source
la source
Macros.h
, puis importez ce fichier dans votre fichierprefix.pch
.Réponses:
Ewww… ne mettez pas de macros dans un fichier .pch! Un fichier .pch est, par définition, un en-tête précompilé spécifique au projet. Il ne doit vraiment pas être utilisé au-delà du contexte du projet et il ne doit vraiment contenir que des
#include
s et des#import
s.Si vous avez des macros et que vous souhaitez partager entre les en-têtes, alors collez-les dans un fichier d'en-tête qui leur est propre -
Common.h
ou autre - et#include
cela au début du .pch.la source
Pour iOS et OS X modernes, les utilisateurs devraient utiliser des modules . Ceci est activé par défaut pour les nouveaux projets et l'importation / inclusion est effectuée à l'aide de
@import
.Les modules permettent au compilateur de créer une représentation intermédiaire du contenu d'un module (par exemple les en-têtes d'un framework). Tout comme un PCH, cette représentation intermédiaire peut être partagée entre plusieurs traductions. Mais les modules vont encore plus loin car un module n'est pas nécessairement spécifique à une cible, et leurs déclarations n'ont pas besoin d'être localisées (en a
*.pch
). Cette représentation peut vous épargner une tonne de travail de compilateur redondant.En utilisant des modules, vous n'avez pas besoin d'un PCH, et vous devriez probablement les supprimer complètement - en faveur de l'utilisation de
@import
local à la dépendance. Dans ce cas, un PCH vous évite seulement de taper inclusions locales dans les dépendances (ce que l'OMI vous devriez faire de toute façon).Maintenant, si nous revenons à la question originale: vous devriez éviter de remplir votre PCH avec toutes sortes de choses aléatoires; Macros, constantes
#defines
et toutes sortes de petites bibliothèques. En règle générale, vous devez omettre ce qui est vraiment inutile pour la majorité de vos fichiers source . Mettre toutes sortes de choses dans votre PCH ne fait qu'ajouter beaucoup de poids et de dépendance. Je vois des gens mettre tout ce qu'ils relient et plus encore dans le PCH. En réalité, les frameworks auxiliaires ne doivent généralement être visibles que par quelques traductions dans la plupart des cas. Par exemple: "Voici nos trucs StoreKit - importons StoreKit uniquement là où il doitÊtre visible. Plus précisément, ces 3 traductions ". Cela réduit vos temps de construction et vous aide à garder une trace de vos dépendances, afin que vous puissiez réutiliser le code plus facilement. Donc, dans un projet ObjC, vous vous arrêterez généralement à Foundation. S'il y en a beaucoup de l'interface utilisateur, alors vous pouvez envisager d'ajouter UIKit ou AppKit à votre PCH. Tout cela suppose que vous souhaitiez optimiser les temps de construction. L'un des problèmes avec les PCH volumineux qui incluent (presque) tout est que la suppression des dépendances inutiles prend beaucoup de temps. Une fois les dépendances de votre projet augmentent et vos temps de construction augmentent, vous devez riposter en éliminant les dépendances inutiles afin de réduire vos temps de construction. De plus, tout ce qui change souvent doit généralement être conservé hors de votre PCH. Un changement nécessite une reconstruction complète. Il existe quelques options pour partager des PCH. Si vous utilisez des PCH,En ce qui concerne ce que j'ai mis dans mon PCH: j'ai arrêté de les utiliser pour la grande majorité des cibles il y a des années. Il n'y a généralement pas assez de points communs pour se qualifier. Gardez à l'esprit que j'écris C ++, ObjC, ObjC ++ et C - le compilateur en émet un pour chaque langue de votre cible. Ainsi, leur activation entraînait souvent des temps de compilation plus lents et des E / S plus élevées. En fin de compte, augmenter la dépendance n'est pas un bon moyen de lutter contre la dépendance dans des projets complexes. En travaillant avec plusieurs langues / dialectes, il existe de nombreuses variations dans les dépendances requises pour une cible donnée. Non, je ne conseillerais pas cela comme optimal pour chaque projet, mais cela donne une certaine perspective à la gestion des dépendances dans les grands projets.
Références
Remarques
la source
#import "MyLib/MyLib.h"
. Chaque fois qu'un fichier est inclus par desMyLib.h
modifications, chaque fichier source de l'application doit être recompilé. Si vous utilisez MyLib dans un seul fichier source, seul ce fichier doit être recompilé lorsque MyLib change. Croyez-le ou non, je n'utilise aucun fichier PCH ces jours-ci.Je suis d'accord avec bbum. Mon point de vue sur le fichier PCH est qu'il ne devrait contenir à peu près que des déclarations
#include
ou#import
. Donc, si vous avez un tas de macros utiles et de haut niveau, définissez-les dans quelque chose commeCommon.h
et#import
ce fichier, comme le suggère bbum.Je vais habituellement un peu plus loin et d' utiliser le fichier de PCH à
#import
un fichier appeléXXCategories.h
(oùXX
est la convention de préfixe nommage des classes que vous utilisez) qui contient#import
s pour tous mes UIKit et catégories classe Fondation:NSString+XXAdditions.h
,UIColor+XXAdditons.h
, etc.la source
#import
et simplement les importer#import
directement? Ne serait-ce pas la même chose? Ou cela affecte-t-il les performances?#import
et#include
.créer un fichier d'en-tête "macros.h"
importer cet en-tête dans Prefix.pch
Dans ce macros.h mettez tous les cadres et autres choses importantes.
Si vous êtes préoccupé par les performances, ne vous inquiétez pas, regardez ce que dit Apple:
En-têtes et performances
aussi dans mes macros.h j'ai mis beaucoup de constantes comme:
la source
#define async(...) dispatch_async(dispatch_get_main_queue(), __VA_ARGS__ )
... pour exécuter des blocs sur le thread principal:async(^{ self.someLabel.text = @":D"; });