Pourquoi ProjectName-Prefix.pch n'est-il pas créé automatiquement dans Xcode 6?

264

Pourquoi n'est-il pas ProjectName-Prefix.pchcréé automatiquement dans Xcode 6?

L'en-tête de précompilation n'est-il plus nécessaire?

Où dois-je écrire le code qui était ProjectName-Prefix.pchauparavant?

Wei
la source

Réponses:

136

Je soupçonne à cause des modules, qui suppriment le besoin de #import <Cocoa/Cocoa.h>.

Quant à savoir où mettre le code que vous mettriez dans un en-tête de préfixe, il n'y a pas de code que vous devez mettre dans un en-tête de préfixe. Mettez vos importations dans les fichiers qui en ont besoin. Mettez vos définitions dans leurs propres fichiers. Mettez vos macros ... nulle part. Arrêtez d'écrire des macros, sauf s'il n'y a pas d'autre moyen (comme lorsque vous en avez besoin __FILE__). Si vous avez besoin de macros, mettez-les dans un en-tête et incluez-les.

L'en-tête du préfixe était nécessaire pour les choses qui sont énormes et utilisées par presque tout dans le système entier (comme Foundation.h). Si vous avez quelque chose d'énorme et d'omniprésent, vous devriez repenser votre architecture. Les en-têtes de préfixe rendent la réutilisation du code difficile et introduisent des problèmes de construction subtils si l'un des fichiers répertoriés peut changer. Évitez-les jusqu'à ce que vous ayez un sérieux problème de temps de construction dont vous pouvez démontrer qu'il est considérablement amélioré avec un en-tête de préfixe.

Dans ce cas, vous pouvez en créer un et le passer en clang, mais il est incroyablement rare que ce soit une bonne idée.


EDIT: Pour votre question spécifique sur un HUD que vous utilisez dans tous vos contrôleurs de vue, oui, vous devez absolument l'importer dans chaque contrôleur de vue qui l'utilise réellement. Cela rend les dépendances claires. Lorsque vous réutilisez votre contrôleur de vue dans un nouveau projet (ce qui est courant si vous construisez bien vos contrôleurs), vous saurez immédiatement ce dont il a besoin. Ceci est particulièrement important pour les catégories, qui peuvent rendre le code très difficile à réutiliser si elles sont implicites.

Le fichier PCH n'est pas là pour se débarrasser des dépendances de listage. Vous devez toujours importer UIKit.hou Foundation.hselon les besoins, comme le font les modèles Xcode. La raison pour laquelle le PCH est d'améliorer les temps de construction lorsqu'il s'agit d'en-têtes vraiment massifs (comme dans UIKit).

Rob Napier
la source
102
@Rob votre réponse est une diatribe subjective. Je ne suis pas d'accord qu'il devrait être accepté comme réponse à cette question. Comment implémenteriez-vous quelque chose comme ceci github.com/seancook/TWReverseAuthExample/blob/… sans pch? Importer le journal dans chaque fichier? Cela crée tout un tas de ballonnements inutiles dans votre code.
Maxim Veksler
26
Chaque fichier qui utilise réellement cette macro, oui (selon mon expérience, c'est généralement moins que tous les fichiers du système). Ceci est un très bon exemple de mon propos. L'importer masque implicitement le fait que vous avez une dépendance sur cette macro de journalisation. Lorsque vous essayez de copier TWAPIManager.m, par exemple, vers un autre projet, vous obtiendrez des erreurs qui TWALog()ne sont pas définies, sans aucune indication sur l'endroit où le trouver. J'ai rencontré exactement ce problème sur plusieurs grands projets essayant de partager du code. Sa création TWAPILog.het son importation résout ce problème avec un coût de développement insignifiant.
Rob Napier
5
J'utilise ReactiveCocoa dans presque toutes les classes, il serait insensé pour moi de ne pas utiliser de fichier pch ...
Stefano Mondino
2
Non seulement les modules, mais le support rapide est probablement un gros morceau.
uchuugaka
12
La clé est que PCH est un en -tête précompilé . La pré-compilation est pour les performances de construction, pas pour la disponibilité automatique. La pré-compilation présente plusieurs façons de gâcher votre build, et devrait être réservée aux choses énormes qui ne changent jamais entre les builds non propres (comme Foundation).
Rob Napier
425

Sans vous demander s'il est approprié ou non, vous pouvez ajouter manuellement un fichier PCH:

  1. Ajoutez un nouveau fichier PCH au projet: Nouveau fichier> Autre> Fichier PCH .

  2. À l' option Paramètres de construction de la cible , définissez la valeur de l'en- tête de préfixe sur le nom de votre fichier PCH, avec le nom du projet comme préfixe (c'est-à-dire pour le projet nommé TestProjectet le fichier PCH nommé MyPrefixHeaderFile, ajoutez la valeur TestProject/MyPrefixHeaderFile.pchà la liste).

    CONSEIL: Vous pouvez utiliser des choses comme $(SRCROOT)ou $(PROJECT_DIR)pour accéder au chemin où vous placez le .pchdans le projet.

  3. Dans l' option Paramètres de construction de la cible , définissez la valeur de l'en- tête de préfixe de précompilation sur YES.

Yedidya Reiss
la source
32
Malgré mes opinions sur les fichiers PCH, +1. Il est toujours utile pour les gens de savoir comment utiliser les outils.
Rob Napier
20
@Yedidya, je voulais juste dire un petit merci pour avoir pris le temps de communiquer la réponse à la question malgré tous les jugements que vous en avez. J'apprécie le fait que les gens prennent le temps de répondre cordialement aux questions plutôt que de simplement réprimander la personne à quel point la question est mal avisée.
campo
3
Merci. Je trouve cela utile lors de l'incorporation de certains de mes Objective-C dans un projet Swift, donc je n'ai pas besoin de revenir en arrière et d'ajouter un tas de fichiers d'inclusion à chacun de ces fichiers .m.
Chris Prince
Très pratique lors de la transition d'ObjC à Swift - J'ai un tas de bibliothèques écrites en ObjC et la dernière chose que je veux faire est de toutes les éditer pour inclure les bons en-têtes du système.
Echelon
1
Cela n'a pas fonctionné pour moi car j'ai utilisé les paramètres de construction de la cible. Cependant, quand j'ai suivi ces instructions, la modification des paramètres de construction du projet a plutôt fonctionné.
Pauls
128

Vous devez créer votre propre fichier PCH
AjouterNew file -> Other-> PCH file

Ajoutez ensuite le chemin de ce fichier PCH à votre build setting->prefix header->path

($ (SRCROOT) /filename.pch)

entrez la description de l'image ici

Prakash Raj
la source
3
Eh bien, selon le répertoire de travail, les variables peuvent varier. J'utilise$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Si vous conservez le fichier .pch dans le dossier particulier, la situation s'est produite.
Prakash Raj
51

Je vais vous montrer avec une photo!

  1. Ajouter un nouveau fichier Ajouter un nouveau fichier

  2. Allez dans Project / Build Setting / APPl LLVM 6.0-Language Ajouter un nouveau fichier

Slemon
la source
24

Pour ajouter un fichier .pch-

1) Ajoutez un nouveau fichier .pch à votre projet-> Nouveau fichier-> autre-> Fichier PCH

2) Accédez au paramètre de construction de votre projet.

3) Recherchez "en-tête de préfixe". Vous pouvez le trouver sous Apple LLVM.

4) Collez ceci dans le champ $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Nettoyez et construisez le projet. C'est tout!!!

entrez la description de l'image ici

Subham93
la source
12

Si vous décidez d'ajouter manuellement un fichier .pch et que vous souhaitez utiliser Objective-C comme avant xCode 6, vous devrez également importer les frameworks UIKit et Foundation dans le fichier .pch. Sinon, vous devrez importer ces frameworks manuellement dans chaque fichier d'en-tête. Vous pouvez quand même ajouter le code suivant pendant qu'il teste la langue utilisée:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
mgm
la source
2
Tout ce qui implique du code ObjC doit être enveloppé dans le #ifdef _ OBJC _ ci-dessus , sinon vous obtiendrez des erreurs de sources C (au cas où vous en avez) que vous ne comprendrez jamais
ishahak
7

Utilisation :

$ (PROJECT_DIR) / Nom du projet / PrefixHeader.pch

Arash Zeinoddini
la source
1
Existe-t-il une sorte de déclaration $ pour "Nom du projet" ??
Amit
7

Pour ajouter un nouveau fichier PCH, suivez les étapes ci-dessous:

(1) Ajouter une nouvelle vue - Sélectionnez iOS - Autre et fichier PCH

(2) ajouter le chemin de ce fichier PCH à votre projet - BuildSetting - Apple LLVM 6.0 Language

Ajouter un chemin d'en-tête de préfixe défini YourApplicationName (root-path) /filename.pch

Hitesh Vaghela
la source
Veuillez expliquer le dernier. Ajouter un chemin d'en-tête de préfixe défini.
Naveed Abbas