Objective c OSX目标的预处理器宏?
我有一个既有iOS目标又有OSX目标的项目。在为OSX编译时,是否有一个预处理器宏是正确的?我试过这个:Objective c OSX目标的预处理器宏?,objective-c,ios,xcode,macos,cocoa,Objective C,Ios,Xcode,Macos,Cocoa,我有一个既有iOS目标又有OSX目标的项目。在为OSX编译时,是否有一个预处理器宏是正确的?我试过这个: #if TARGET_OS_MAC @interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> { #else @interface BFNode : NSObject { #endif 在TargetConditionals.h中查看完整列表,包括: #define TARGET_OS_MAC
#if TARGET_OS_MAC
@interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> {
#else
@interface BFNode : NSObject {
#endif
在TargetConditionals.h中查看完整列表,包括:
#define TARGET_OS_MAC 1
#define TARGET_OS_IPHONE 1
#define TARGET_IPHONE_SIMULATOR 1
这是因为
TARGET\u OS\u MAC
也是在构建iOS时定义的
看看这个
我会尝试在目标上通过构建设置构建我自己的特定于目标的define。我建议使用以下方法:
#define TARGET_OS_OSX (!(TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH))
如果你使用Swift,有一个很好的方法。如果您使用的是Objective-C,执行以下操作通常很有用:
#include <TargetConditionals.h>
#if TARGET_OS_IPHONE
@import UIKit;
#else
@import AppKit;
#endif
从Xcode 8 GM开始,这是iOS 10.0中TargetConditionals.h的相关部分:
#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 */
(在Xcode中文本编辑器上方的“面包屑”中,ios10.0>usr/include>TargetConditionals.h
)
…对于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 */
(在Xcode中文本编辑器上方的“面包屑”中,macOS 10.12>usr/include>TargetConditionals.h
)
TARGET\u OS\u MAC
在两种平台上都定义为1,但TARGET\u OS\u OSX
仅在macOS上定义为1
在该文件的注释中,它们描述如下:
- TARGET_OS_MAC:生成的代码将在MAC OS X变体下运行
- TARGET_OS_OSX:生成的代码将在OSX设备下运行
我猜在当时的某个时候(也许是在iPhone发布的时候?),有人认为iOS(né“iPhone OS”)符合“Mac OS X变体”的定义。根据
TargetConditionals.h
(似乎从2020年起,任何平台都适用):
+---------------------------------------------------------------------+
|目标操作系统MAC|
| +---+ +-----------------------------------------------+ +---------+ |
|| | |目标|操作系统| IPHONE | | ||
| | | | +---------------+ +----+ +-------+ +--------+ | | | |
|| | | | | | | | | | | | | ||
|| OSX | | | | |+---------| | |电视| | |观看| | | | | | | |驾驶室|
|| | | | | | | | | | | | | ||
| | | | |+-------------+| | | | | | | | | | |
| | | | +---------------+ +----+ +-------+ +--------+ | | | |
| +---+ +-----------------------------------------------+ +---------+ |
+---------------------------------------------------------------------+
这告诉我们:
将是(可能)在苹果平台上运行的任何Cocoa应用程序的TARGET\u OS\u MAC
1
- 对于macOS目标,
将仅为TARGET\u OS\u OSX
1
对于任何非Mac Apple产品都将是TARGET_OS_IPHONE
1
仅适用于IOSTARGET\u OS\u IOS
仅用于。看来TARGET\u OS\u MACCATALYST
也会起作用TARGET\u OS\u UIKITFORMAC
仅适用于tvOSTARGET\u OS\u TV
仅适用于watchOSTARGET\u OS\u WATCH
仅用于(它目前甚至不支持第三方应用程序,因此您可能总是看到它是TARGET\u OS\u BRIDGE
)0
在构建时将为TARGET\u OS\u DRIVERKIT
1
- 对于macOS目标,
⚠️ 但是等等!⚠️ 我是从iOS14(MacOS11,WatchOS7)SDK中得到的。如果我回顾iOS 13(macOS 10.15,watchOS 6)SDK,我会看到:
+----------------------------------------------------------------+
|目标操作系统MAC|
| +---+ +-----------------------------------------------------+ |
|| | |目标|操作系统| IPHONE ||
|| OSX | |+------++++------++++------+++------++++------+||
|| | | | | | | | | IOS | | | |电视| | | | | | | |桥| | MACCATALYST|
| | | | +-----+ +----+ +-------+ +--------+ +-------------+ | |
| +---+ +-----------------------------------------------------+ |
+----------------------------------------------------------------+
值得注意的是,TARGET\u OS\u DRIVERKIT
在14年中是新的,而TARGET\u OS\u MACCATALYST
现在在IOS
中。这告诉我,如果假定TARGET\u OS\u MACCATALYST
和iOS
是完全分开的,那么针对ios14sdk编译会破坏为ios13编写的一些C代码
此外,这些定义如下:
仅用于。您可以使用上面的目标操作系统模拟器
s进一步完善此功能#define
是为了防止你想用苹果的SDK制作Windows应用程序。我个人只知道苹果自己的(比如iTunes、Safari和QuickTime)。如果您想随身携带现有的Objective-C代码,现在Swift支持Windows,这可能会很有用TARGET\u OS\u WIN32
适用于非Apple UNIX系统TARGET\u OS\u UNIX
用于表示模拟器TARGET\u IPHONE\u模拟器
用于指iOS、tvOS和watchOS非模拟设备TARGET_OS_EMBEDDED
可能用来指iPod NANO(我在网上找不到任何历史用法)TARGET\u OS\u NANO
另一个需要注意的是,这是明显不同的,包括Android、Cygwin和其他未明确支持但在技术上可以工作的平台的
#define
s
我不完全确定该怎么做。我猜想这是为了编译SWIFT基础框架,而不是为了消耗它,因为SWIFT不消耗<代码>定义< <代码> S.< /P> < P>我遇到THI。
#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 */
#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 */
#if os(iOS) || os(watchOS)
public protocol TFPasteboardReading { }
public protocol TFPasteboardWriting { }
#elseif os(macOS)
public typealias TFPasteboardReading=NSPasteboardReading
public typealias TFPasteboardWriting=NSPasteboardWriting
#endif
@objc(TFCategory)
public class TFCategory: TFBaseModel, TFPasteboardReading, TFPasteboardWriting {
...
}