@importar vs # importar-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 discute en el video WWDC "Implementing Engaging UI on 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 estoy teniendo problemas para encontrarlo. Estoy buscando información sobre cuándo usar esto. Solo puede ser Apple marcos? ¿Son los beneficios de usar esta directiva de compilador suficientes para que vuelva atrás y actualice el código antiguo?

Author: Cœur, 2013-09-22

5 answers

Es una nueva característica llamada Modules o "semantic import". Hay más información en el WWDC 2013 videos para la sesión 205 y 404. Es una especie de mejor implementación de las cabeceras precompiladas. Puede usar módulos con cualquiera de los frameworks del sistema en iOS 7 y Mavericks. Los módulos son un paquete conjunto del ejecutable del marco y sus encabezados y se promocionan como más seguros y más eficientes que #import.

Uno de los las grandes ventajas de usar @import es que no es necesario agregar el marco en la configuración del proyecto, se hace automáticamente. Eso significa que puede omitir el paso en el que hace clic en el botón más y buscar el marco (golden toolbox), luego moverlo al grupo "Frameworks". Salvará a muchos desarrolladores de los crípticos mensajes de "Error del enlazador".

En realidad no necesitas usar la palabra clave @import. Si opta por usar módulos, todos #import y #include las directivas 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 compilación, especialmente si no ha estado utilizando bien PCHs o si su proyecto tiene muchos archivos fuente pequeños.

Los módulos están pre-construidos para la mayoría de los frameworks de Apple (UIKit, MapKit, GameKit, etc.). Puede usarlos con frameworks que cree usted mismo: se crean automáticamente si crea un marco Swift en Xcode, y puede crear manualmente un".modulemap " file yourself for any Apple or 3rd-party library.

Puede usar code-completion para ver la lista de frameworks disponibles:

introduzca la descripción de la imagen aquí

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 compilación del proyecto, busque " Módulos "y establezca" Habilitar módulos "en"SÍ". Los " Marcos de Enlace" debe ser "SÍ" también:

Usted tiene que estar utilizando Xcode 5 y el iOS 7 o Mavericks SDK, pero todavía se puede liberar para OSs más antiguos (por ejemplo, iOS 4.3 o lo que sea). Los módulos no cambian la forma en que se construye su código ni el código fuente.


De las diapositivas de WWDC:

  • Importa una descripción semántica completa de un framework
  • No necesita analizar las cabeceras
  • Mejor manera de importar un framework interfaz
  • Carga la representación binaria
  • Más flexible que las cabeceras precompiladas
  • Inmune a los efectos de las definiciones macro locales (por ejemplo, #define readonly 0x01)
  • Habilitado para nuevos proyectos por defecto

Para usar explícitamente módulos:

Sustitúyase #import <Cocoa/Cocoa.h> por @import Cocoa;

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

@import iAd.ADBannerView;

Los submódulos se autocompletan para usted en Xcode.

 812
Author: nevan king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 10:24:49

Buena respuesta la puedes encontrar en libro Aprendiendo Cacao con Objective-C (ISBN: 978-1-491-90139-7)

Los módulos son un nuevo medio para incluir y vincular archivos y bibliotecas en sus proyectos. Para entender cómo funcionan los módulos y qué beneficios tienen, es importante mirar hacia atrás en la historia de Objective-C y la declaración # import Siempre que desee incluir un archivo para su uso, generalmente tendrá algún código que se vea así:

#import "someFile.h"

O, en el caso de marcos:

#import <SomeLibrary/SomeFile.h>

Debido a que Objective-C es un superconjunto del lenguaje de programación C, el estado #import es un refinamiento menor sobre la declaración #include de C. La instrucción # include es muy simple; copia todo lo que encuentra en el archivo incluido en su código durante la compilación. Esto a veces puede causar problemas significativos. Por ejemplo, imagine que tiene dos archivos de encabezado: SomeFileA.h y SomeFileB.h; SomeFileA.h includes SomeFileB.h, and SomeFileB.h includes SomeFileA.h. Esto crea un bucle, y puede confundir la coimpiler. Para lidiar con esto, los programadores de C tienen que escribir guardias contra este tipo de evento.

Al usar #import, no necesita preocuparse por este problema o escribir protectores de encabezado para evitarlo. Sin embargo, #import sigue siendo solo una acción glorificada de copiar y pegar, causando un tiempo de compilació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 de su propio código.)

Los módulos son intenta evitar esto. Ya no son una copia y pega 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 compilará más rápido, y será más seguro que usar #include o #import.

Volviendo al ejemplo anterior de importar un framework:

#import <SomeLibrary/SomeFile.h>

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

@import SomeLibrary;

Esto tiene la ventaja añadida de que Xcode enlaza el framework 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 usar el componente AwesomeObject en el framework AwesomeLibrary, normalmente tendría que importar todo solo para usar el one piece. Sin embargo, usando módulos, solo puede importar el objeto específico que desea usar:

@import AwesomeLibrary.AwesomeObject;

Para todos los nuevos proyectos realizados en Xcode 5, los módulos están habilitados por defecto. Si desea utilizar módulos en proyectos antiguos (y realmente debería), tendrán que estar habilitados en la configuración de compilación del proyecto. Una vez que lo haga, puede usar ambas sentencias #import y @import en su código juntas sin ninguna preocupación.

 41
Author: gbk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-27 19:26:48

Actualmente solo funciona para los frameworks de sistema integrados. Si utiliza #import como Apple todavía importa el marco UIKit en el delegado de la aplicación se reemplaza (si modules está activado y se reconoce como un marco de sistema) y el compilador lo reasignará para que sea una importación de módulo y no una importación de los archivos de encabezado de todos modos. Así que dejar el #import será lo mismo que convertirlo en una importación de módulo cuando sea posible de todos modos

 2
Author: RyanTCB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-07 08:44:41

Parece que desde XCode 7.x aparecen muchas advertencias al habilitar el módulo clang con CLANG_ENABLE_MODULES

Echa un vistazo a Muchas advertencias al construir con Xcode 7 con bibliotecas de terceros

 2
Author: loretoparisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 15:13:08

Hay algunos beneficios de usar módulos. Solo se puede usar con el framework de Apple a menos que se cree module map. @import es un poco similar a los archivos de encabezados precompilados cuando se agregan al archivo .pch, que es una forma de ajustar la aplicación al proceso de compilación. Además no tiene que agregar bibliotecas de la manera antigua, usar @import es mucho más rápido y eficiente de hecho. Si todavía buscas una buena referencia, te recomiendo encarecidamente que leas este artículo .

 1
Author: Julian Król,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-18 22:41:20