454 votes

@import vs #import - iOS 7

Je suis à jouer avec certains de la nouvelle iOS 7 fonctions et de travailler avec certains des Effets d'Image tel que discuté dans la WWDC vidéo "la mise en Œuvre de Mobiliser de l'INTERFACE utilisateur sur iOS". Pour produire un effet de flou dans le code source de la séance, UIImage a été étendu par l'intermédiaire d'une catégorie qui les importations UIKit comme suit:

@import UIKit;

Je pense que j'ai vu quelque chose à ce sujet dans une autre session de la vidéo, mais je vais avoir du mal à le trouver. Je suis à la recherche de toutes les informations générales sur l'utilisation de ce. Peut-il être utilisé uniquement avec Apple cadres? Sont les avantages de l'utilisation de ce complier directive assez que je devrais revenir en arrière et de mise à jour de l'ancien code?

860voto

nevan king Points 46410

C'est une nouvelle fonctionnalité appelée Modules ou "sémantique de l'importation". Il n'y a plus d'infos dans la WWDC 2013 des vidéos pour la Session 205 et 404. C'est un peu une meilleure mise en œuvre de la pré-têtes précompilés. Vous pouvez utiliser les modules avec l'un des cadres du système dans iOS 7 et Mavericks. Les Modules sont un emballage d'ensemble du cadre de l'exécutable et les en-têtes et sont considérés comme étant plus sûr et plus efficace que l' #import.

Un des grands avantages de l'utilisation de @import , c'est que vous n'avez pas besoin d'ajouter du cadre dans les paramètres du projet, c'est fait automatiquement. Cela signifie que vous pouvez omettre l'étape où vous cliquez sur le bouton plus et de recherche pour le cadre (golden boîte à outils), puis de le déplacer vers les "Cadres" du groupe. Il permettra d'économiser beaucoup de des développeurs de l'énigmatique "de l'éditeur de liens d'erreur, les messages".

Vous n'avez pas besoin d'utiliser l' @import mot-clé. Si vous optez pour l'utilisation de modules, tous #import et #include directives sont mappés à @import automatiquement. Cela signifie que vous n'avez pas à changer votre code source (ou le code source des bibliothèques que vous téléchargez à partir d'ailleurs). Soi-disant à l'aide de modules améliore la génération de performance trop, surtout si vous n'avez pas été à l'aide de PCHs bien ou si votre projet a de nombreux petits fichiers sources.

Les Modules fonctionnent uniquement avec Apple cadres (UIKit, MapKit, GameKit, etc). Vous ne pouvez pas les utiliser avec les cadres de vous créer vous-même. Actuellement, vous ne pouvez pas les utiliser avec de la 3e partie des cadres (AFNetworking, RestKit, MagicalRecord). Je ne pense pas que cela fonctionne avec les non-Apple cadres, même si elles sont incluses dans Xcode (dylibs comme libsqlite3.dylib). Vous pouvez utiliser de l'achèvement de code pour voir la liste de cadres que vous pouvez utiliser:

enter image description here

Les Modules sont activés par défaut dans les nouveaux projets dans Xcode 5. Pour les activer dans un ancien projet, allez dans votre projet de construction paramètres, recherche pour "Modules" et coché "Activer les Modules" à "OUI". Le Lien de "Cadres" doit être "OUI":

Vous devez être en utilisant Xcode 5 et iOS 7 ou Mavericks SDK, mais vous pouvez toujours la libération pour les anciens systèmes d'exploitation (dire iOS 4.3 ou quoi que ce soit). Les Modules de ne pas modifier le fonctionnement de votre code est intégré ou tout le code source.


À partir de la WWDC de diapositives:

  • Les importations complet description sémantique d'un cadre
  • N'a pas besoin d'analyser les en-têtes
  • Meilleure façon d'importer un cadre de l'interface
  • Les charges de représentation binaire
  • Plus souple que les en-têtes précompilés
  • Immunisé aux effets de locaux définitions de macro (par exemple, #define readonly 0x01)
  • Activée pour les nouveaux projets par défaut

Pour utiliser explicitement des modules:

Remplacer #import <Cocoa/Cocoa.h> avec @import Cocoa;

Vous pouvez également importer juste un en-tête avec cette notation:

@import iAd.ADBannerView;

Les submodules de saisie semi-automatique pour vous dans Xcode.

49voto

Kirill Points 609

Belle réponse que vous pouvez trouver dans le livre d'Apprentissage de Cacao avec Objective-C (ISBN: 978-1-491-90139-7)

Les Modules sont un nouveau moyen d'inclure et de liens entre fichiers et les bibliothèques dans vos projets. Pour comprendre la façon dont les modules de travail et les avantages qu'ils ont, il est important de regarder en arrière dans l'histoire de l'Objective-C et de l'instruction #import Chaque fois que vous voulez inclure un fichier pour l'utiliser, vous aurez généralement un code qui ressemble à ceci:

#import "someFile.h"

Ou, dans le cas de cadres:

#import <SomeLibrary/SomeFile.h>

Parce que l'Objective-C est un sur-ensemble du langage de programmation C, l'instruction #import est un mineur de raffinement sur les C #include déclaration. L'instruction #include est très simple; il copie tout ce qu'il trouve dans le fichier inclus dans votre code lors de la compilation. Cela peut parfois causer des problèmes importants. Par exemple, imaginez que vous avez deux fichiers d'en-tête: SomeFileA.h et SomeFileB.h; SomeFileA.h inclut SomeFileB.h, et SomeFileB.h inclut SomeFileA.h. Cela crée une boucle, et peut confondre le coimpiler. Pour faire face à cela, C programmeurs ont à écrire garde contre ce type d'événement se produise.

Lors de l'utilisation d' #import, vous n'avez pas besoin de vous soucier de ce problème ou de l'écriture de l'en-tête des gardes pour l'éviter. Toutefois, #import n'est encore qu'une simple copier-coller d'action, ce qui ralentit le temps de compilation parmi une foule d'autres plus petites, mais toujours très dangereux (comme un fichier inclus primordial quelque chose que vous avez déclaré ailleurs dans votre propre code.)

Les Modules sont une tentative de contourner ce problème. Ils ne sont plus un copier-coller dans le code source, mais un sérialisés représentation de l'inclusion de fichiers pouvant être importés dans votre code source seulement quand et où ils sont nécessaires. Par l'utilisation de modules, code général de la compilation plus rapide et plus sûr que l'aide soit #include ou #import.

En reprenant l'exemple précédent de l'importation d'un cadre:

#import <SomeLibrary/SomeFile.h>

Pour importer cette bibliothèque en tant que module, le code devrait être modifié afin de:

@import SomeLibrary;

Cela a l'avantage supplémentaire de Xcode reliant la SomeLibrary cadre dans le projet automatiquement. Des Modules vous permettent également d'inclure uniquement les composants dont vous avez vraiment besoin dans votre projet. Par exemple, si vous souhaitez utiliser le AwesomeObject composant dans le AwesomeLibrary cadre, normalement vous devez importer tout juste à utiliser le one piece. Cependant, en utilisant des modules, vous pouvez simplement importer l'objet spécifique que vous souhaitez utiliser:

@import AwesomeLibrary.AwesomeObject;

Pour tous les nouveaux projets réalisés dans Xcode 5, les modules sont activés par défaut. Si vous souhaitez utiliser des modules dans les projets plus anciens (et vous devriez vraiment), ils devront être activé dans le projet de construction de paramètres. Une fois que vous faites cela, vous pouvez utiliser les deux #import et @import des déclarations dans votre code, ensemble, sans aucun souci.

4voto

Ryan Forsyth Points 467

Il fonctionne actuellement uniquement pour la construction dans les cadres de système. Si vous utilisez comme apple encore faire importer la cadre dans le délégué d’app c’est remplacé (si les modules est sur et son reconnues dans le cadre d’un système) et le compilateur est remapper qu’il est un module d’importation et non une importation des fichiers d’en-tête, de toute façon. Laissant ainsi le `` sera tout de même que son converti à une importation du module lorsque c’est possible en tout cas

1voto

Julian Król Points 1596

Il ya quelques avantages de l'utilisation de modules. Vous pouvez l'utiliser uniquement avec Apple cadre, à moins que le module de carte est créée. @import est un peu similaire à la pré-compilation des en-têtes de fichiers lorsqu'il est ajouté à l' .pch le fichier qui est une manière de tune application le processus de compilation. En outre, vous n'avez pas à ajouter des bibliothèques à l'ancienne, à l'aide de @import est beaucoup plus rapide et efficace en fait. Si vous recherchez une belle référence que je vous recommande fortement la lecture de cet article.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X