Pregunta

he visto muchos desarrolladores que añaden varias macros convenientes para la Prefix.pch de sus proyectos de iOS.

Lo que hace (o no) se recomienda que en el archivo de IOS Prefix.pch? Lo que hace su mirada como Prefix.pch?

¿Fue útil?

Solución

Ewww ... no poner las macros en un archivo .pch! Un archivo .pch es, por definición, un proyecto específico encabezado precompilado. Realmente no debe utilizarse más allá del contexto del proyecto y realmente no debe contener nada más que #includes y #imports.

Si usted tiene algunas macros y de tal manera que desea compartir entre cabeceras, a continuación, pegarlos en un archivo de cabecera de su propio - Common.h o lo que sea - y #include que en el comienzo de la. PCH.

Otros consejos

Para iOS y OS X moderna, las personas deben utilizar Módulos . Esta es activado por defecto para nuevos proyectos e importación / inclusión se logra usando @import.

módulos permiten el compilador para crear una representación intermedia de los contenidos de un módulo (encabezados por ejemplo, una de marco). Al igual que un PCH, esta representación intermedia puede ser compartida a través de múltiples traducciones. Pero módulos llevan un paso más allá, porque un módulo no es necesariamente específico de destino, y sus declaraciones no necesita ser localizado (a un *.pch). Esta representación puede ahorrar una tonelada de trabajo redundante compilador.

El uso de módulos, que no necesitan un PCH, y es probable que sólo deben acabar con ellos por completo - en favor del uso @import local a la dependencia. En ese caso, un PCH es solamente ahorrándole de escribiendo inclusiones locales a dependencias (OMI, que usted debe hacer de todos modos).

Ahora, si miramos hacia atrás a la pregunta original: Usted debe evitar llenar su PCH con todo tipo de cosas al azar; Macros, constantes, #defines, y todo tipo de pequeños bibliotecas. En general, debe omitir lo que realmente es innecesario a la mayoría de los archivos de origen . Poniendo todo tipo de cosas en su PCH es sólo la adición de un montón de peso y la dependencia. Veo gente pone todo lo que enlaza y más en el PCH. En realidad, los marcos auxiliares normalmente sólo tienen que ser visibles a unos traducciones en la mayoría de los casos. P.ej. "Aquí está nuestra materia StoreKit - Vamos StoreKit sólo importación donde debe ser visible En concreto, estos 3 traducciones.". Esto mantiene sus tiempos de construcción hacia abajo, y le ayuda a mantener un registro de sus dependencias, de manera que es posible reutilizar el código más fácilmente. Así, en un proyecto ObjC, que se suele dejar en la Fundación. Si hay una gran cantidad de interfaz de usuario, entonces usted podría considerar la adición UIKit o AppKit a su PCH. Todo esto está suponiendo que desea optimizar el momento de generación. Uno de los problemas con grandes PCH que incluyen (casi) todo es que la eliminación de dependencias innecesarias es mucho tiempo. Una vez que las dependencias de su proyecto crecen y sus tiempos de construcción suben, tiene que luchar por la eliminación de dependencias innecesarias con el fin de reducir los tiempos de construcción. Además, cualquier cosa que cambia a menudo general, debería mantenerse fuera de su PCH. Un cambio requiere una reconstrucción completa. Hay algunas opciones para compartir PCH. Si utiliza PCH, no como objetivo el intercambio de apoyo.

En cuanto a lo que pongo en mi PCH: dejé de usarlos para la gran mayoría de los objetivos hace años. No solo por lo general no es suficiente en común para calificar. Tenga en cuenta, escribo C ++, ObjC, ObjC ++ y C - que emite el compilador uno para cada idioma en su objetivo. Así que les dieron lugar a menudo en tiempos de compilación más lentas y mayor de E / S. En última instancia, el aumento de la dependencia no es una buena manera de luchar contra la dependencia en proyectos complejos. Trabajar con varios idiomas / dialectos, hay mucha variación en las dependencias necesarias para un objetivo determinado. No, yo no aconsejaría que lo más óptimo para cada proyecto, pero eso da una idea de gestión de la dependencia en los proyectos más grandes.


Referencias


Notas

  • Esta pregunta se formuló originalmente un par de años antes de la introducción de módulos.
  • Actualmente (Xcode 5.0), los módulos de trabajo para C y ObjC, pero no C ++.

Estoy de acuerdo con bbum. Mi opinión sobre el archivo PCH es que debe contener prácticamente sólo declaraciones #include o #import. Así que si usted tiene un montón de votos macros, de alto nivel, los definen en algo así como Common.h y #import ese archivo, como se sugirió bbum.

Yo suelo ir un paso más allá y utilizar el archivo PCH a #import una llamada XXCategories.h (donde XX es la convención de nombres de clase prefijo que usa) El archivo que contiene #imports para toda mi UIKit y Fundación categorías de clase: NSString+XXAdditions.h, UIColor+XXAdditons.h, etc.

crear un archivo de cabecera "macros.h"

importar esta cabecera en Prefix.pch

En este macros.h poner todos los marcos y otras cosas importantes.

Si está preocupado por el rendimiento, no se preocupe, mirada lo que Apple dice:

Conectores y rendimiento

  

Si le preocupa que la inclusión de un archivo de cabecera maestro puede hacer que su   programa para la hinchazón, no se preocupe. Debido a que las interfaces OS X se implementan   utilizando marcos, el código para esas interfaces reside en un dinámico   biblioteca compartida y no en su ejecutable. Además, sólo el código   utilizado por el programa está siempre cargado en memoria en tiempo de ejecución, por lo que su   en memoria huella de manera similar se queda pequeña.         En cuanto a que incluye un gran número de archivos de cabecera durante la compilación, una vez más, no se preocupe. Xcode ofrece una precompilado   instalación de cabecera para acelerar los tiempos de compilación. Mediante la compilación de toda la   encabezados de marco a la vez, no hay necesidad de volver a compilar los encabezados   a menos que se añada un nuevo marco. Mientras tanto, se puede utilizar cualquier   interface de los marcos incluidos con poco o ningún rendimiento   penalti.

También en mi macros.h me puso un montón de constantes como:

// delegate
#define UIAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]
#define APPDELEGATE   ((AppDelegate *)[[UIApplication sharedApplication] delegate])

// system
#define IS_IPHONE_4INCH (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height==568)
#define IS_IPAD                     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

// screen size
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
#define IS_RETINA_DISPLAY ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
#define IS_PORTRAIT                 UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])
#define IS_LANDSCAPE                UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])

//system version
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

// math
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

// cores
#define RGB(r,g,b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
#define MAKECOLOR(R, G, B, A) [UIColor colorWithRed:((float)R/255.0f) green:((float)G/255.0f) blue:((float)B/255.0f) alpha:A]
#define MAKECOLORFROMHEX(hexValue) [UIColor colorWithRed: ((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]



//customizations
#define SHOW_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
#define HIDE_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

#define SHOW_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:FALSE];
#define HIDE_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:TRUE];

#define VC_OBJ(x) [[x alloc] init]
#define VC_OBJ_WITH_NIB(x) [[x alloc] initWithNibName : (NSString *)CFSTR(#x) bundle : nil]

#define RESIGN_KEYBOARD [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

#define CLEAR_NOTIFICATION_BADGE                       [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
#define REGISTER_APPLICATION_FOR_NOTIFICATION_SERVICE  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]

#define HIDE_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
#define SHOW_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top