Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c OSX目标的预处理器宏?_Objective C_Ios_Xcode_Macos_Cocoa - Fatal编程技术网

Objective c 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

我有一个既有iOS目标又有OSX目标的项目。在为OSX编译时,是否有一个预处理器宏是正确的?我试过这个:

#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 | | | | |+---------| | |电视| | |观看| | | | | | | |驾驶室|
|| | | | | | | | | | | | | ||
| |   | | |+-------------+| |    | |       | |        | | |         | |
| |   | | +---------------+ +----+ +-------+ +--------+ | |         | |
| +---+ +-----------------------------------------------+ +---------+ |
+---------------------------------------------------------------------+
这告诉我们:

  • TARGET\u OS\u MAC
    将是(可能)在苹果平台上运行的任何Cocoa应用程序的
    1

    • 对于macOS目标,
      TARGET\u OS\u OSX
      将仅为
      1
    • TARGET_OS_IPHONE
      对于任何非Mac Apple产品都将是
      1
      • TARGET\u OS\u IOS
        仅适用于IOS
        • TARGET\u OS\u MACCATALYST
          仅用于。看来
          TARGET\u OS\u UIKITFORMAC
          也会起作用
      • TARGET\u OS\u TV
        仅适用于tvOS
      • TARGET\u OS\u WATCH
        仅适用于watchOS
      • TARGET\u OS\u BRIDGE
        仅用于(它目前甚至不支持第三方应用程序,因此您可能总是看到它是
        0
    • TARGET\u OS\u DRIVERKIT
      在构建时将为
      1

⚠️ 但是等等!⚠️ 我是从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代码


此外,这些定义如下:


  • 目标操作系统模拟器
    仅用于。您可以使用上面的
    #define
    s进一步完善此功能
  • TARGET\u OS\u WIN32
    是为了防止你想用苹果的SDK制作Windows应用程序。我个人只知道苹果自己的(比如iTunes、Safari和QuickTime)。如果您想随身携带现有的Objective-C代码,现在Swift支持Windows,这可能会很有用
  • TARGET\u OS\u UNIX
    适用于非Apple UNIX系统
这些都已弃用,不应再使用。也就是说,您可能会在必须维护的代码中找到它们,因此它们的含义如下:

  • TARGET\u IPHONE\u模拟器
    用于表示模拟器
  • TARGET_OS_EMBEDDED
    用于指iOS、tvOS和watchOS非模拟设备
  • TARGET\u OS\u NANO
    可能用来指iPod 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 {

...

}