@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 imagen como se discutió en el video de WWDC “Implementación de la interfaz de usuario en iOS”. Para producir un efecto de desenfoque dentro del código fuente de la sesión, UIImage se extendió a través de una categoría que importa UIKit de la siguiente manera:

 @import UIKit; 

Creo que vi algo sobre esto en otro video de la sesión pero tengo problemas para encontrarlo. Estoy buscando información de contexto sobre cuándo usar esto. ¿Solo se puede usar con marcos Apple? ¿Los beneficios de usar esta directiva de comstackción son suficientes para que regrese y actualice el código anterior?

Es una nueva característica llamada Módulos o “importación 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 módulos con cualquiera de los frameworks del sistema en iOS 7 y Mavericks. Los módulos son un paquete del ejecutable marco y sus encabezados y se promocionan como más seguros y eficientes que #import .

Una de las grandes ventajas de usar @import es que no necesita agregar el marco en la configuración del proyecto, se hace automáticamente . Eso significa que puede omitir el paso donde hace clic en el botón más y busca el marco (caja de herramientas dorada), luego lo mueve al grupo “Marcos”. Salvará a muchos desarrolladores de los crípticos mensajes de “error del enlazador”.

En realidad, no necesita usar la palabra clave @import . Si opta por utilizar módulos, 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 módulos también mejora el rendimiento de comstackción, especialmente si no ha utilizado bien los PCH o si su proyecto tiene muchos archivos fuente pequeños.

Los módulos están preconstruidos para la mayoría de los frameworks de Apple (UIKit, MapKit, GameKit, etc.). Puede usarlos con marcos creados por usted mismo: se crean automáticamente si crea un marco Swift en Xcode, y puede crear manualmente un archivo “.modulemap” para cualquier biblioteca Apple o de terceros .

Puede usar la finalización del código para ver la lista de marcos disponibles:

enter image description here

Los módulos están habilitados por defecto en nuevos proyectos en Xcode 5 . Para habilitarlos en un proyecto anterior, vaya a la configuración de comstackción de su proyecto, busque “Módulos” y configure “Habilitar módulos” en “SÍ”. Los “Frameworks de enlace” también deberían ser “SÍ”:

Tienes que estar usando Xcode 5 y iOS 7 o Mavericks SDK, pero aún puedes lanzarlo para sistemas operativos anteriores (digamos iOS 4.3 o lo que sea). Los módulos no cambian la forma en que se construye el código ni el código fuente.


De las diapositivas WWDC:

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

Para usar módulos explícitamente:

Reemplace #import con @import Cocoa;

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

 @import iAd.ADBannerView; 

Los submódulos se autocompletan en Xcode.

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

Los módulos son una nueva forma de incluir y vincular archivos y bibliotecas en sus proyectos. Para comprender cómo funcionan los módulos y qué beneficios tienen, es importante mirar hacia atrás en la historia de Objective-C y la statement #import. Cuando quiera incluir un archivo para su uso, generalmente tendrá un código que se ve así:

 #import "someFile.h" 

O en el caso de los marcos:

 #import  

Debido a que Objective-C es un superconjunto 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 archivo incluido en su código durante la comstackción. Esto a veces puede causar problemas significativos. Por ejemplo, imagine que tiene dos archivos de encabezado: SomeFileA.h SomeFileB.h ; SomeFileA.h incluye SomeFileB.h , y SomeFileB.h incluye SomeFileA.h . Esto crea un ciclo y puede confundir al coprilista. Para hacer frente a esto, los progtwigdores C tienen que escribir guardias contra este tipo de evento.

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

Los módulos son un bash de evitar esto. Ya no son un código de copiar y pegar en el código fuente, sino una representación serializada de los archivos incluidos que se pueden importar a su código fuente solo cuando y donde se necesiten. Al usar módulos, 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  

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

 @import SomeLibrary; 

Esto tiene la ventaja adicional de que Xcode vincula el marco de SomeLibrary al proyecto automáticamente. Los módulos también le permiten incluir 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 usarlo de una sola pieza. Sin embargo, al usar módulos, puede importar el objeto específico que desea usar:

 @import AwesomeLibrary.AwesomeObject; 

Para todos los proyectos nuevos hechos en Xcode 5, los módulos están habilitados por defecto. Si desea utilizar módulos en proyectos anteriores (y realmente debería), deberán estar habilitados en la configuración de comstackción del proyecto. Una vez que lo hagas, puedes usar las sentencias #import y @import en tu código sin ninguna preocupación.

Actualmente solo funciona para los marcos de sistema integrados. Si usas #import como apple para importar el marco UIKit en el delegado de la aplicación, se reemplaza (si los módulos están UIKit y se reconoce como un marco de sistema) y el comstackdor lo correlacionará para que sea una importación de módulo y no una importación del archivos de encabezado de todos modos. Así que dejar el #import será exactamente igual a su conversión a un módulo de importación donde sea posible de todos modos

Parece que debido a que muchas advertencias de XCode 7.xa están apareciendo cuando se habilita el módulo clang con CLANG_ENABLE_MODULES

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

Hay algunos beneficios de usar módulos. Puede usarlo solo con el marco de trabajo de Apple a menos que se cree un mapa de módulo. @import es un poco similar a los archivos de encabezados .pch cuando se agrega al archivo .pch , que es una forma de ajustar la aplicación al proceso de comstackción. Además, no es necesario agregar bibliotecas de la manera antigua, usar @import es mucho más rápido y eficiente. Si aún busca una buena referencia, le recomendaré que lea este artículo .