使用pragma ifdef为mac和ios有条件地编译相同的协议头?

时间:2012-11-06 16:50:20

标签: ios xcode cocoa compiler-construction

  

可能重复:
  Which conditional compile to use to switch between Mac and iPhone specific code?

我已经定义了一个协议,它在Mac和iOS上都可以正常工作。但是,协议的一种方法最好返回一个特定的对象类(而不仅仅是'id'),但该类不是基础类,因此在两个平台上有所不同(例如,UIButton和NSButton)。

如何使用像#ifdef TARGET_OS_IPHONE这样的pragma标记在两个库中包含相同的协议标题,一个用于iOS,一个用于Mac?

这是我的实际协议和条件编译的(破坏)尝试

#import <Foundation/Foundation.h>

@protocol SharedAppDelegate <NSObject>

#ifdef TARGET_OS_IPHONE
@protocol UIApplicationDelegate;
+ (NSObject<UIApplicationDelegate> *)sharedAppDelegate;
#else
@protocol NSApplicationDelegate;
+ (NSObject<NSApplicationDelegate> *)sharedAppDelegate;
#endif

@end

我不知道的一件事是目标不包括模拟器,但我找不到一个覆盖Mac和另一个所有iOS版本的目标的实例。

1 个答案:

答案 0 :(得分:3)

你会踢自己。它是#if而不是#ifdefTARGET_OS_IPHONE#define,对于iOS设置为1,对于mac设置为0。您想使用简单的#if

#if TARGET_OS_IPHONE
    NSLog(@"is iPhone or simulator");
#else
    NSLog(@"is mac... probably");
#endif

此外,您不能在协议定义中具有协议的前向声明。你必须做类似的事情:

#if TARGET_OS_IPHONE
@protocol UIApplicationDelegate;
#else
@protocol NSApplicationDelegate;
#endif


@protocol SharedAppDelegate <NSObject>
#if TARGET_OS_IPHONE
+ (NSObject<UIApplicationDelegate> *)sharedAppDelegate;
#else
+ (NSObject<NSApplicationDelegate> *)sharedAppDelegate;
#endif