2011-01-25 11 views
8

Estoy escribiendo una biblioteca de clases para Mac OS X e iOS que se lanzará como un Cocoa Framework para OS X y una biblioteca estática para iOS. Para simplificar las cosas, tengo la intención de utilizar múltiples objetivos en Xcode. Sin embargo, las clases en Mac OS X se vinculan contra Cocoa.h mientras que en iOS se vinculan contra Foundation.h.¿Se pueden usar las directivas de preprocesador para importar diferentes archivos de encabezado para Mac e iOS?

Mis preguntas son básicamente:

  • Podría el enlace marco Mac OS X contra el Foundation.framework en su lugar? Las clases utilizadas en el marco son NSString, NSMutableString y NSMutableArray.
  • O podría utilizar directivas de preprocesador dentro de los archivos de cabecera para controlar la inclusión de marcos, p.

    #ifdef MacOSX 
        #import <Cocoa/Cocoa.h> 
    #else 
        #import <Foundation/Foundation.h> 
    #endif 
    
+0

Tome un vistazo a este http://stackoverflow.com/questions/3181321/which-conditional- compilar-para-usar-para-cambiar-entre-mac-y-código-específico-iphone. – detunized

Respuesta

20

Usted puede utilizar estas para el código dependiente de la plataforma separada (ver TargetConditionals.h):

#ifdef TARGET_OS_IPHONE 
    // iOS 
#elif defined TARGET_IPHONE_SIMULATOR 
    // iOS Simulator 
#elif defined TARGET_OS_MAC 
    // Other kinds of Mac OS 
#else 
    // Unsupported platform 
#endif 

Aquí hay una useful chart.

+3

Hice un poco de prueba y corregí el código en consecuencia. Aparentemente 'TARGET_OS_MAC' también está definido para iOS. Lo mejor es realmente mirar en 'TargetConditionals.h' y ver qué macros se adaptan a tus necesidades. Hay bastantes de ellos. – detunized

+1

Creo que ahora necesitas usar '#if TARGET_OS_IPHONE', en lugar de' # ifdef'. –

+3

Esta respuesta es incorrecta. Hay un par de problemas: Primero, 'TARGET_OS_IPHONE' siempre se definirá. A veces se define como 0, pero aún está definido. Lo mismo con 'TARGET_IPHONE_SIMULATOR'. Pero, también, 'TARGET_IPHONE_SIMULATOR' nunca será 1 a menos que' TARGET_OS_IPHONE' también sea 1.Si necesita verificar el simulador de iOS específicamente, primero debe verificarlo, como: '#if TARGET_IPHONE_SIMULATOR' /' #elif TARGET_OS_IPHONE'/'#elif TARGET_OS_MAC' /' # endif'. –

2
  • Podría el enlace marco Mac OS X contra el Foundation.framework en su lugar? Las clases utilizadas en el marco son NSString, NSMutableString y NSMutableArray.

Pruébalo y mira. Si la compilación falla, no. Si tiene éxito, sí.

  • O podría utilizar las directivas de preprocesador dentro de los archivos de cabecera para controlar la inclusión marco, por ejemplo,

Sí, puede hacerlo. De hecho, creo que es el único forma de hacerlo.

+0

Gracias. Pensando en ello, Foundation es un marco, por lo tanto, supongo que no debería haber un problema. ¡Lo probaré y lo veré! – BWHazel

+0

Ahora que lo pienso, Core Plot hace exactamente lo que quieres hacer. Si tiene problemas, compruébelo y vea lo que hacen. – CajunLuke

8

Funciona como un encanto:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 

    #if TARGET_IPHONE_SIMULATOR 
    // ios simulator 

    #elif TARGET_OS_IPHONE 
    // ios device 

    #elif TARGET_OS_MAC 
    // mac os 

    #else 
    // Unsupported platform 
    #endif 
#endif 
+0

Creo que esta es la única respuesta aquí que realmente funcionará. –

1

Esto funciona perfectamente para mí:

#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED 
//iOS 
#else 
//Mac 
#endif 
Cuestiones relacionadas