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_MAC将1用于(可能)的苹果平台上运行的任何Cocoa应用程序。
TARGET_OS_OSX仅1适用于macOS目标TARGET_OS_IPHONE将1任何非Mac苹果产品
TARGET_OS_IOS 仅适用于iOSTARGET_OS_TV 仅用于tvOSTARGET_OS_WATCH 仅用于watchOSTARGET_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)
这是因为TARGET_OS_MAC在为iOS构建时也已定义。
请参阅http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html。
我会尝试通过目标上的构建设置来构建自己的目标特定定义。
| 归档时间: |
|
| 查看次数: |
10719 次 |
| 最近记录: |