Una de las novedades en iOS 7 con la que tal vez ya te hayas encontrado es la directiva @import:
// Donde dije: #import <UIKit/UIKit.h> // ahora digo @import UIKit;La directiva @import indica una gran novedad en el lenguaje Objective C, y de hecho, en todos los lenguajes de la familia de C: los módulos (o módules en Inglés).
¿Como funciona #import en Objective C?
Cuando el compilador está procesando un fichero .m y se encuentra con un #import <UIKit/UIKit.h>, hace lo siguiente:- Va a la carpeta UIKit (que está en un directorio conocido por el compilador)
- Copia el contenido del fichero UIKit.h y lo pega en el .m, donde antes ponía #import <UIKit/UIKit.h>
- Como el contenido de UIKit.h es un montón de otros #import que apuntan a otros ficheros de cabecera, el compilador repite el proceso.
- Cuando finalmente ya no quedan más ficheros de cabecera que importar (es decir, copiar y pegar) es cuando se compila el fichero .m gigante que ha resultado de tanto copiar y pegar.
Fichero de cabecera precompilado (.pch) al rescate
Una forma de resolver esto, es de compilar todo UIKit, Foundation y demás frameworks del sistema 1 sola vez y luego simplemente enlazarlo.// Contenido de un pch #import <Availability.h> #ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <iAd/iAd.h> #endifCon esto, además se logra que esos ficheros de cabecera pasen a estar «mágicamente» disponibles en todos los demás ficheros de tu proyecto. Es decir, si tienes UIKit importado en el pch, no hace falta volverlo a importar en otra parte (aunque si lo haces, no pasa nada). Lo malo del fichero de cabecera precompilado (o pch), es precisamente que hace un solo paquete de un montón de cosas distintas (en el caso de arriba, Foundation, UIKit y iAd). No siempre me interesa tener todo eso, especialmente cosas más específicas como iAd, disponible en todas mis clases. Lo interesante sería que cada framework del sistema fuese una especie de precompilado. Es decir, que no necesite de ese copiar y pegar infernal que genera #import y que retrasa la compilación. Pues bien, eso existe, y son los famosos módulos de Objective C (o modules en Inglés).
Módulos (modules) en Objective C e iOS 7
Un módulo es todo el código de una framework, empaquetado que tal forma que facilita su inclusión en tus clases. Con los módulos tienes todas las ventajas del fichero de cabecera precompilado (pch) y algunos extras:- No está todo junto y revuelto, sino que cada framework es un módulo a parte
- No hace falta incluir la framework en tu proyecto, cuando incluyes el módulo en el código, lo demás se hace por ti.
@import iAd; // ¡No hace falta añadir la framework en el proyecto! @import CoreData; // ¡No hace falta añadir la framework en el proyecto!
Submódulos en Objective C e iOS 7
Además, un módulo puede estar compuesto de varios submódulos. Supongamos que no necesito TODO iAd en mi App, sino tan sólo ADBannerView. No tendría mucho sentido importar TODA la framework. Esto también lo resuelven los módulos: importa sólo el submódulo que necesitas:@import iAd.ADBannerView; // Solo lo que necesito, gracias.
¡Me encanta @import! pero…¿donde está la pega?
Escucha y aprende, pequeño saltamontes
Efectivamente, pequeño saltamontes, siempre hay una pega y es la siguiente: sólo Apple puede crear módulos. Es decir, solo puedes usar @import para código de Apple. Con tu código, NO puedes usar @import. Los pobres seguimos condenados a usar #import. 😛 Hay otra pega, y es la siguiente, NO se puede usar @import para C++ o para ObjectiveC++. Entonces ¿qué hago? ¿Uso @import o #import? Mi recomendación es la siguiente: Proyectos Antiguos Simplemente activa los módulos en los «Build Settings» del proyecto y no cambies nada en tu código. Es decir, deja los #import tal y como están. Si activas los módulos en los settings, Xcode transformará los #import de frameworks del sistema por @import y tendrás las ventajas de los módulos (mayor velocidad de compilación) sin tener que hacer nada. Por la cara, vamos. Proyectos Nuevos Olvídate del pch y usa @import para todas las frameworks del sistema. Sigue usando #import para tu propio código.