@import vs #import – iOS 7

Estoy jugando con algunas de las nuevas características de iOS 7 y trabajando con algunos de los efectos de image como se discutió en el video de WWDC "Implementing UI Engaging in iOS". Para producir un efecto de desenfoque dentro del código fuente de la session, UIImage se amplió a través de una categoría que importa a UIKit de la siguiente manera:

 @import UIKit; 

Creo que vi algo sobre esto en otro video de session, pero tengo problemas para encontrarlo. Estoy buscando información de antecedentes sobre cuándo usar esto. ¿Se puede usar solo con frameworks de Apple? ¿Son suficientes los beneficios de usar esta directiva del comstackdor como para volver y actualizar el código antiguo?

Es una nueva característica llamada Módulos o "import semántica". Hay más información en los videos de la WWDC 2013 para las sesiones 205 y 404 . Es una especie de mejor implementación de los encabezados precomstackdos. Puede usar modules con cualquiera de los frameworks del sistema en iOS 7 y Mavericks. Los modules son un empaquetado set del ejecutable del marco y sus encabezados y se promociona como más seguro y más eficiente que #import .

Una de las grandes ventajas de usar @import es que no es necesario agregar el marco en la configuration del proyecto, sino que se realiza automáticamente . Eso significa que puede omitir el paso donde hace clic en el button más y search el marco (caja de herramientas dorada), luego moverlo al grupo "Estructuras". Salvará a muchos desarrolladores de los crípticos posts de "error del linker".

En realidad, no necesita usar la palabra key @import . Si opta por usar modules, todas las directivas #import y #include se asignan para usar @import automáticamente. Eso significa que no tiene que cambiar su código fuente (o el código fuente de las bibliotecas que descarga desde otro lugar). Supuestamente, el uso de modules también mejora el performance de la compilation, especialmente si no ha estado usando PCH o si su proyecto tiene muchos files fuente pequeños.

Los modules están preconstruidos para la mayoría de los frameworks de Apple (UIKit, MapKit, GameKit, etc.). Puede usarlos con los frameworks que crea usted mismo: se crean automáticamente si crea un marco Swift en Xcode y puede crear manualmente un file ".modulemap" para cualquier biblioteca Apple o de terceros .

Puede usar la terminación de código para ver la list de frameworks disponibles:

introduzca la descripción de la imagen aquí

Los modules están habilitados de manera pnetworkingeterminada en nuevos proyectos en Xcode 5 . Para habilitarlos en un proyecto anterior, ingrese a la configuration de construcción de su proyecto, busque "Módulos" y configure "Habilitar modules" en "SÍ". Los "Marcos de enlaces" deberían ser "SÍ" también:

Tienes que estar usando Xcode 5 y el iOS 7 o Mavericks SDK, pero puedes seguir lanzando para sistemas operativos más antiguos (por ejemplo iOS 4.3 o lo que sea). Los modules no cambian la forma en que se construye su código ni ninguno del código fuente.


Desde las diapositivas WWDC:

  • Importa una descripción semántica completa de un marco
  • No es necesario analizar los encabezados.
  • Mejor forma de importar la interfaz de un marco.
  • Carga la representación binaria
  • Más flexibles que los encabezados precomstackdos
  • Inmune a los efectos de las macro definiciones locales (por ejemplo, #define readonly 0x01 )
  • Habilitado para nuevos proyectos por defecto

Para usar modules explícitamente:

Reemplace #import <Cocoa/Cocoa.h> con @import Cocoa;

También puede importar solo un encabezado con esta notación:

 @import iAd.ADBannerView; 

Los submodules autocompletan para usted en Xcode.

Buena respuesta que puede encontrar en el libro Learning Cocoa with Objective-C (ISBN: 978-1-491-90139-7)

Los modules son un nuevo medio para include y vincular files y bibliotecas en sus proyectos. Para comprender cómo funcionan los modules y los beneficios que tienen, es importante mirar hacia atrás en el historial de Objective-C y la statement #import. Cuando quiera include un file para usarlo, generalmente tendrá un código similar a este:

 #import "someFile.h" 

O en el caso de los frameworks:

 #import <SomeLibrary/SomeFile.h> 

Debido a que Objective-C es un superset del lenguaje de progtwigción C, la statement #import es un refinamiento menor sobre la statement #include de C. La statement #include es muy simple; Copia todo lo que encuentra en el file incluido en su código durante la compilation. Esto a veces puede causar problemas significativos. Por ejemplo, imagine que tiene dos files de encabezado: SomeFileA.h y SomeFileB.h ; SomeFileA.h incluye SomeFileB.h , y SomeFileB.h incluye SomeFileA.h . Esto crea un bucle y puede confundir al coimstackdor. Para lidiar con esto, los progtwigdores C tienen que escribir guardias contra este tipo de evento.

Cuando use #import , no necesita preocuparse por este problema ni escribir protectores de encabezado para evitarlo. Sin embargo, #import sigue siendo una acción de copyr y pegar glorificada, lo que provoca un time de compilation lento entre una serie de otros problemas más pequeños pero aún muy peligrosos (como un file incluido que anula algo que ha declarado en otro lugar en su propio código).

Los modules son un bash de evitarlo. Ya no son una copy y pega en el código fuente, sino una representación serializada de los files incluidos que se pueden importar en su código fuente solo cuando y donde se necesiten. Al usar modules, el código generalmente se comstackrá más rápido y será más seguro que usar #include o #import .

Volviendo al ejemplo anterior de importar un marco:

 #import <SomeLibrary/SomeFile.h> 

Para importar esta biblioteca como un module, el código se cambiaría a:

 @import SomeLibrary; 

Esto tiene la ventaja adicional de que Xcode vincula el marco SomeLibrary al proyecto automáticamente. Los modules también le permiten include solo los componentes que realmente necesita en su proyecto. Por ejemplo, si desea utilizar el componente AwesomeObject en el marco AwesomeLibrary, normalmente tendría que importar todo solo para usar una pieza. Sin embargo, al usar modules, puede importar el object específico que desea usar:

 @import AwesomeLibrary.AwesomeObject; 

Para todos los proyectos nuevos realizados en Xcode 5, los modules están habilitados de manera pnetworkingeterminada. Si desea utilizar modules en proyectos anteriores (y realmente debería), deberán habilitarse en la configuration de compilation del proyecto. Una vez que lo haga, puede usar ambas sentencias #import y @import en su código sin ningún tipo de inquietud.

Actualmente solo funciona para los frameworks integrados del sistema. Si utiliza #import como apple, todavía importa el marco de UIKit en el delegado de la aplicación, se reemplaza (si los modules están UIKit y se reconoce como un marco de sistema) y el comstackdor lo reasignará para que sea una import de module y no una import de files de cabecera de todos modos. De modo que dejar el #import será igual que se convierte a una import de module siempre que sea posible de todos modos

Parece que dado que XCode 7.xa muchas advertencias salen cuando se habilita el module de clang con CLANG_ENABLE_MODULES

Eche un vistazo a Muchas advertencias al build con Xcode 7 con bibliotecas de terceros

Hay algunos beneficios de usar modules. Puede usarlo solo con el framework de Apple a less que se cree un map de module. @import es un poco similar a la .pch files de encabezados cuando se agrega al file .pch , que es una forma de ajustar la aplicación al process de compilation. Además, no tiene que agregar bibliotecas de la vieja manera, usar @import es mucho más rápido y eficiente de hecho. Si todavía busca una buena reference, le recomiendo que lea este artículo .