web-dev-qa-db-fra.com

En Objective-C, l'importation des mêmes en-têtes dans chaque classe rallonge le temps de compilation?

Je suis un débutant en programmation Objective-C/iOS.

Je souhaite créer un fichier d’en-tête comprenant tous les en-têtes de classe que j’utilise dans mon projet.
Et importez l'en-tête dans chaque fichier d'en-tête de classe.

Vous aimez cette question:
Y compris plusieurs classes dans le même fichier d'en-tête

Mais cette approche augmente-t-elle le temps de compilation?
Ou existe-t-il un autre inconvénient?

S'il vous plaît dites-moi les bons moyens d'importer des en-têtes.

10
js_

En général, les projets iOS nouvellement générés sont livrés avec cette fonctionnalité, appelée en-tête précompiléou préfixe en-tête et qui est l'extension .pch.

Vous pouvez y insérer tous les en-têtes que vous souhaitez et Xcode le précompilera avant de créer quoi que ce soit d'autre, et l'utilisera pour compiler les autres unités de compilation de votre projet (fichiers .m, par exemple).

L'utilisation d'un en-tête précompilé peut augmenter ou non le temps de compilation. En général, cela réduit le temps de compilation, à condition que vous ayez beaucoup d'en-têtes communs et/ou beaucoup de fichiers sources.

Cependant, il n'est pas forcément judicieux de traiter l'en-tête pré-compilé comme un grand dépotoir, car vos unités de compilation peuvent créer des dépendances implicites pour toutes sortes de choses lorsque vous souhaitez appliquer un couplage lâche entre composants.

23
Shaggy Frog

Le problème avec toutes les classes dans un en-tête est que chaque fois que vous modifiez un en-tête, tous les fichiers y compris même indirectement devront être recompilés, tandis que si vous importez uniquement la classe nécessaire et utilisez également @class, les fichiers qui utilisent directement la classe doivent être recompilés. Ainsi, dans le premier cas, il y aura beaucoup plus de compilations que dans le second. C'est la façon dont je recommanderais de commencer.

Cependant, lorsque votre code devient plus stable et que les classes ne changent PAS, le fait de les mettre toutes dans un en-tête peut améliorer le temps de compilation car l'en-tête précompilé contiendra les mêmes informations pour chaque fichier. Ce que je ferais, c’est que lorsque le code ne changera pas autant, c’est de placer les classes matures dans un Framework et que l’en-tête Framework inclura toutes ces classes.

7
Mark

Vous pouvez importer ce fichier d'en-tête dans vos projets. Prefix_pch file.then Vous pouvez l'utiliser dans vos classes.

6
hacker

Si vous souhaitez que les en-têtes soient importés globalement, vous devez le faire dans le fichier YourProject-Prefix.pch. Ça devrait ressembler a quelque chose comme ca..

#import <Availability.h>

#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif

   #ifdef __OBJC__
   #import <UIKit/UIKit.h>
   #import <Foundation/Foundation.h>
   #import "YourGlobalHeader.h"
#endif

Désormais, YourGlobalHeader.h est automatiquement importé dans toutes vos classes.

4
skram

Le fait de placer tous les en-têtes dans un fichier peut améliorer les performances de construction dans certains cas, mais vous ne remarquerez probablement pas la différence.

Il est préférable de conserver vos en-têtes de classe dans différents fichiers à des fins d'organisation. En outre, si vous incluez uniquement les en-têtes dont vous avez besoin dans vos fichiers source, votre temps de génération sera réduit, bien que cela ne se remarque pas de manière notable si vous utilisez une machine de compilation correcte.

0
ThomasW