OS X目标的预处理器宏?

Dru*_*erB 9 macos xcode cocoa objective-c ios

我有一个既有iOS又有OS X目标的项目.在编译OS X时是否有预处理器宏?我试过这个:

#if TARGET_OS_MAC
@interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> {
#else
@interface BFNode : NSObject {
#endif
Run Code Online (Sandbox Code Playgroud)

TARGET_OS_MAC似乎没有用.当我尝试在iOS上运行应用程序时,我遇到编译器错误,因为它尝试编译第一行,并且NSPasteboardReading在iOS上没有定义协议.

我知道也有TARGET_OS_IPHONE.如果我使用它并交换@interface它起作用的声明.

但是有很多地方我有代码,没有iOS版本,所以我也需要OS X的宏.

解:

我最终在.pch文件中定义了一个新的宏:

#define TARGET_OSX TARGET_OS_IPHONE == 0
Run Code Online (Sandbox Code Playgroud)

Ben*_*ero 11

根据中的文档TargetConditionals.h(似乎是2019年;任何平台):

  +----------------------------------------------------------------+
  |                TARGET_OS_MAC                                   |
  | +---+  +-----------------------------------------------------+ |
  | |   |  |          TARGET_OS_IPHONE                           | |
  | |OSX|  | +-----+ +----+ +-------+ +--------+ +-------------+ | |
  | |   |  | | IOS | | TV | | WATCH | | BRIDGE | | MACCATALYST | | |
  | |   |  | +-----+ +----+ +-------+ +--------+ +-------------+ | |
  | +---+  +-----------------------------------------------------+ |
  +----------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

这告诉我们:

  • TARGET_OS_MAC1用于(可能)的苹果平台上运行的任何Cocoa应用程序。

    • TARGET_OS_OSX1适用于macOS目标
    • TARGET_OS_IPHONE1任何非Mac苹果产品
      • TARGET_OS_IOS 仅适用于iOS
      • TARGET_OS_TV 仅用于tvOS
      • TARGET_OS_WATCH 仅用于watchOS
      • TARGET_OS_BRIDGE仅适用于bridgeOS(目前甚至不支持第三方应用程序,因此您可能总是会看到0
      • TARGET_OS_MACCATALYST仅用于Project Catalyst。看来TARGET_OS_UIKITFORMAC也可以。

此外,还定义了以下内容:

  • TARGET_OS_SIMULATOR仅适用于iOS,tvOS和watchOS模拟器。您可以使用上述#defines 进一步优化
  • TARGET_OS_WIN32万一您想使用Apple的SDK制作Windows应用程序。除了苹果自己的产品(例如iTunes,Safari和QuickTime),我个人并不了解
  • TARGET_OS_UNIX 适用于非macOS UNIX系统

这些已被弃用,不应再使用。就是说,您可能会在必须维护的代码中找到它们,所以这就是它们的含义:

  • TARGET_IPHONE_SIMULATOR曾经是指iPhoneOS模拟器
  • TARGET_OS_EMBEDDED 过去是指iOS,tvOS和watchOS非模拟设备
  • TARGET_OS_NANO 可能曾经是指iPod Nano(我在网上找不到任何历史用法)

别的东西要注意的是,TargetConditionals.h所使用的SWIFT corelibs基金会是显著不同,包括#defineS代表的Android,Cygwin的,和其他未明确支持的,但是,他们-技术上的工作平台。

我不完全确定该怎么做。我猜这是为了编译Swift Foundation框架,而不是为了使用它,因为Swift不使用#defines。


Sam*_*fes 10

如果您正在使用Swift,那么这是一个很棒的语言功能.如果您使用的是Objective-C,那么执行以下操作通常很有用:

#include <TargetConditionals.h>

#if TARGET_OS_IPHONE
    @import UIKit;
#else
    @import AppKit;
#endif
Run Code Online (Sandbox Code Playgroud)

理解TARGET_OS_*定义会使这更有意义.最值得注意的是,TARGET_OS_MAC任何Apple平台都非常出乎意料.!TARGET_OS_IPHONE是macOS,TARGET_OS_IPHONE除此之外的任何东西.iOS,tvOS和watchOS有更具体的定义.

来自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
Run Code Online (Sandbox Code Playgroud)


Til*_*ill 6

这是因为TARGET_OS_MAC在为iOS构建时也已定义。

请参阅http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html

我会尝试通过目标上的构建设置来构建自己的目标特定定义。