2013-08-23 73 views
7

所以問題來了。我準備儘快爲iOS發佈更新,以解決iOS 7中的一些問題。爲此,我需要使用一些特定的iOS 7功能/類型。我已經絕對確信,iOS 7代碼只能在iOS 7上執行,並且會在iOS 7之前回退到不同的代碼。當然,我不允許使用當前的Xcode測試版進行提交,因此我試圖編譯與當前的Xcode版本。不過,我似乎無法找到一個方法來禁用此特定的警告:編譯器的條件隱藏代碼

Use of undeclared identifier '<Redacted>'.

有誰知道的方式使用#pragma禁用此警告。我已經嘗試了很多不同的人,包括

-w-Weverthing-Wall

,但似乎沒有任何工作。

UPDATE 回答:你當然不能,因爲編譯器不能編譯一個它一無所知的標識符。我的解決方案是簡單地創建一個#define

#define <redacted> 1

更新2 下面實際上使人們更容易的答案。我已經創建了#define Xcode5Code(code, alt),它允許我有條件地執行代碼塊。通過使用由@maddy解決方案修改它:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    #define Xcode5Code(code, alt) code 
#else 
    #define Xcode5Code(code, alt) alt 
#endif 

這讓我很容易地通過使用隱藏的來自編譯器的代碼塊:

Xcode5Code({ 
    //Code to be execute only with Xcode 5 
}, { 
    //code to be executed in previous versions of Xcode 
}) 

使用#define Xcode5Code的主要好處是,Xcode中會自動爲您完成,這比使用完整的#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000更容易,Xcode不會自動完成。

這實際上並不能區分iOS 7和iOS 7之前的設備。它只區分當前Xcode可以處理的iOS版本。區分我使用的iOS設備版本:

NSUInteger DeviceSystemMajorVersion(void) { 
    static NSUInteger _deviceSystemMajorVersion = -1; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 
    }); 
    return _deviceSystemMajorVersion; 
} 

上面是Apple的代碼,順便說一下。爲了在NDA上跳舞,我會說這有助於展示根控制器的視圖,因爲這取決於您使用的Xcode版本和設備上的iOS版本。如果你試圖管理測試版和生產代碼,這可以幫助很多。一旦您可以使用Xcode 5提交應用程序,則不再需要#define Xcode5Code

+0

這不是一個警告,這是一個錯誤。你希望編譯器如何操作一個它不知道的標識符? – Mat

+0

這是一個警告嗎?看起來更像是一個錯誤。 – trojanfoe

+0

@Mat啊......當然是啊。顯然我今天需要更多咖啡。是的,這是一個錯誤,當然我不能指望編譯器編譯一些它一無所知的東西。 –

回答

22

如果你想在Xcode兩個差異版本或兩個不同的基地SDK的設置,那麼你應該使用編譯器指令編譯您的應用程序:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported 
    // iOS 7 code here 
#else 
    // Pre-iOS 7 code here 
#endif 

不要用這個運行時檢查。只有在您必須使用兩種不同版本編譯代碼時才能使用此解決方案。一個例子是你添加了iOS 7代碼,但你仍然需要用Xcode 4.6編譯代碼。使用編譯指令可讓您使用較舊的Base SDK從編譯器「隱藏」iOS 7代碼。

請參閱文檔中的「SDK兼容性指南」以獲取有關此更正和運行時檢查的更多信息。