2012-11-06 29 views
1

可能重複:
Which conditional compile to use to switch between Mac and iPhone specific code?使用編譯指示ifdef有條件地爲mac和ios編譯相同的協議標頭?

我定義它應該工作在Mac和iOS上就好了一個協議。然而,協議的其中一種方法會更好地返回一個特定的對象類(而不僅僅是'id'),但該類不是基礎類,因此在兩個平臺上(例如UIButton和NSButton)會有所不同。

如何使用像#ifdef TARGET_OS_IPHONE這樣的編譯標記在兩個庫中包含相同的協議標頭,一個爲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所有應用的目標。

+0

它類似於 - 相信我,我一直在尋找這個問題失敗了一個小時,詢問我之前 - 但因爲這個問題有一個具體的例子現在已經被正確地解決,我會說它是不同的。儘管感謝您的鏈接。 – SG1

回答

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 
+0

這工作,但我沒有測試過設備vs模擬器。顯然,TARGET_OS_IPHONE區分了這些,我想要的是區分Mac和iOS,而不考慮設備。 – SG1

+0

我不確定你在哪裏看到'TARGET_OS_IPHONE'在設備和模擬器之間的評估方式不同,我從未聽說過。如果你想要一個宏來測試模擬器,使用'TARGET_IPHONE_SIMULATOR'。對於iOS目標,「TARGET_OS_IPHONE」評估爲真。 – NJones