Estoy trabajando en un proyecto que incluye una aplicación Mac y una aplicación para iPad que comparten código. ¿Cómo puedo usar los modificadores de compilación condicionales para excluir el código específico de Mac del proyecto de iPhone y viceversa? Me he dado cuenta de que TARGET_OS_IPHONE
y TARGET_OS_MAC
son ambos 1, por lo que ambos son siempre ciertos. ¿Hay algún otro conmutador que pueda usar que solo se vuelva verdadero al compilar para un objetivo específico?¿Qué compilación condicional usar para cambiar entre el código específico de Mac y iPhone?
En la mayoría de los casos, obtuve los archivos para cooperar moviendo #include <UIKit/UIKit.h>
y #include <Cocoa/Cocoa.h>
en los encabezados de precompilación para los dos proyectos. Estoy compartiendo modelos y algunos códigos de utilidad que obtienen datos de feeds RSS y Evernote.
En particular, la función [NSData dataWithContentsOfURL:options:error:]
toma una constante diferente para el parámetro de opciones iOS 3.2 y anterior, y Mac OS 10.5 y anterior que para iOS 4 y Mac OS 10.6. El condicional que estoy usando es:
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2)) || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5))
Esto parece funcionar, pero yo quiero para asegurarse de que esto es a prueba de balas. Según entiendo, si la versión de Mac está configurada en 10.6, pero la versión de iOS está configurada en 3.2, seguirá usando las nuevas constantes, incluso si está compilando para iOS 3.2, lo que parece incorrecto.
¡Gracias de antemano por cualquier ayuda!
Desafortunadamente, TARGET_OS_IPHONE parece estar definido en cualquiera de los casos, si usted tiene un proyecto tanto para iOS y OSX. –
Sí. Se define como 0 para OSX, 1 para iOS. Necesitas usar '#if TARGET_OS_IPHONE', no' #ifdef TARGET_OS_IPHONE'. Se agregó un ejemplo. –
Por cierto, la tabla es del "controlador de tiempo de ejecución" de Apple. Si la realidad parece estar en desacuerdo con él, cuestiona la realidad. :) –