¿Macro del preprocesador para los objectives de OS X?

Tengo un proyecto que tiene un objective iOS y un OS X. ¿Hay una macro de preprocesador que sea verdadera cuando compilo para OS X? He intentado esto:

#if TARGET_OS_MAC @interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> { #else @interface BFNode : NSObject { #endif 

Pero TARGET_OS_MAC no parece funcionar. Cuando bash ejecutar la aplicación en iOS, obtengo un error de compilation porque intenta comstackr la primera línea y no hay NSPasteboardReading protocolo NSPasteboardReading definido en iOS.

Sé que TARGET_OS_IPHONE también. Si utilizo eso e intercambia las declaraciones @interface , funciona.

Pero hay muchos lugares donde tengo código, que no tiene versión de iOS, por lo que también necesito una macro para OS X.

SOLUCIÓN:

Terminé de definir una nueva macro en el file .pch:

 #define TARGET_OSX TARGET_OS_IPHONE == 0 

Esto se debe a que TARGET_OS_MAC se define al TARGET_OS_MAC iOS.

Consulte http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html en eso.

Intentaría y buildía mi propio objective específico definir a través de build-settings en el objective.

Si está usando Swift, hay una excelente function de idioma para esto. Si está utilizando Objective-C, a menudo es útil hacer algo como esto:

 #include <TargetConditionals.h> #if TARGET_OS_IPHONE @import UIKit; #else @import AppKit; #endif 

Comprender los TARGET_OS_* hará que esto tenga mucho más sentido. Más notablemente, TARGET_OS_MAC es cualquier plataforma de Apple que es bastante inesperada. !TARGET_OS_IPHONE es macOS y TARGET_OS_IPHONE es todo lo demás. Existen definiciones más específicas para iOS, tvOS y watchOS.

Desde TargetConditions.h :

 TARGET_OS_* These conditionals specify in which Operating System the generated code will run. Indention is used to show which conditionals are evolutionary subclasses. The MAC/WIN32/UNIX conditionals are mutually exclusive. The IOS/TV/WATCH conditionals are mutually exclusive. TARGET_OS_WIN32 - Generated code will run under 32-bit Windows TARGET_OS_UNIX - Generated code will run under some Unix (not OSX) TARGET_OS_MAC - Generated code will run under Mac OS X variant TARGET_OS_IPHONE - Generated code for firmware, devices, or simulator TARGET_OS_IOS - Generated code will run under iOS TARGET_OS_TV - Generated code will run under Apple TV OS TARGET_OS_WATCH - Generated code will run under Apple Watch OS TARGET_OS_SIMULATOR - Generated code will run under a simulator TARGET_OS_EMBEDDED - Generated code for firmware TARGET_IPHONE_SIMULATOR - DEPRECATED: Same as TARGET_OS_SIMULATOR TARGET_OS_NANO - DEPRECATED: Same as TARGET_OS_WATCH 

Busque en TargetConditionals.h una list completa, que incluye:

 #define TARGET_OS_MAC 1 #define TARGET_OS_IPHONE 1 #define TARGET_IPHONE_SIMULATOR 1 

Recomendaría usar esto:

 #define TARGET_OS_OSX (!(TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH)) 

A partir de Xcode 8 GM, esta es la sección relevante de TargetConditionals.h en iOS 10.0:

 #define TARGET_OS_MAC 1 #define TARGET_OS_WIN32 0 #define TARGET_OS_UNIX 0 #define TARGET_OS_OSX 0 #define TARGET_OS_IPHONE 1 #define TARGET_OS_IOS 1 #define TARGET_OS_WATCH 0 #define TARGET_OS_BRIDGE 0 #define TARGET_OS_TV 0 #define TARGET_OS_SIMULATOR 0 #define TARGET_OS_EMBEDDED 1 #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */ 

(En la sección 'breadcrumb' sobre el editor de text en Xcode, iOS 10.0 > usr/include > TargetConditionals.h )

… Y este es el mismo file, para macOS:

 #define TARGET_OS_MAC 1 #define TARGET_OS_WIN32 0 #define TARGET_OS_UNIX 0 #define TARGET_OS_OSX 1 #define TARGET_OS_IPHONE 0 #define TARGET_OS_IOS 0 #define TARGET_OS_WATCH 0 #define TARGET_OS_BRIDGE 0 #define TARGET_OS_TV 0 #define TARGET_OS_SIMULATOR 0 #define TARGET_OS_EMBEDDED 0 #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */ 

(En la sección 'breadcrumb' sobre el editor de text en Xcode, macOS 10.12 > usr/include > TargetConditionals.h )

TARGET_OS_MAC se define como 1 en ambas plataforms, pero TARGET_OS_OSX es 1 solo en macOS.

En los comentarios del file, se describen de la siguiente manera:

  • TARGET_OS_MAC: el código generado se ejecutará bajo la variante Mac OS X.
  • TARGET_OS_OSX: el código generado se ejecutará en dispositivos OS X.

Supongo que en algún momento (quizás alnetworkingedor cuando se anunció el iPhone) alguien decidió que iOS (né "iPhone OS") se ajusta a las definiciones de "variante Mac OS X".