2013-10-01 21 views
0

嗨,在我的一個應用程序中,我必須支持IOS6的應用程序& IOS7.爲了完成這一步,我必須知道當前的設備版本。爲此,我定義了一個宏,我試圖將該宏用作完成我的任務的參考。我寫的代碼如下。如何在目標c中使用預處理器

在.h文件中,我定義爲IPhoneOSVersion 50000

這個代碼在.m文件

if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"]) 
    { 

     #undef IPhoneOSVersion 
     #define IPhoneOSVersion 70000 

     NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion); 
    } 
    else 
    { 

      #undef IPhoneOSVersion 
      #define IPhoneOSVersion 60000 

     NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion); 
    } 

NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion); 

如果我運行IOS7此代碼。在控制檯中,數據必須在70000之後打印,如_IPHONE_OS_VERSION_MIN_REQUIRED,但不幸的是,我在60000之後獲得了_IPHONE_OS_VERSION_MIN_REQUIRED。即使我在其他條件下也放了一個斷點,但那不是正在執行,而是宏值正在改變。可以請任何人讓我知道爲什麼宏觀價值如此變化。

回答

1

您不應該對操作系統版本進行硬編碼,Apple推薦的支持多種操作系統版本的方法是檢查某些特定的類,API,協議或函數,這樣可以獲得更大的靈活性,因爲有些東西有時會倒退兼容。

下面是關於如何在代碼http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices檢查特定資源存在一個相當不錯的教程,並從蘋果https://developer.apple.com/library/ios/documentation/developertools/conceptual/cross_development/Using/using.html的文檔

編輯:要回答你爲什麼宏觀變化問題,編譯器越過兩個分支if-else,因此使用宏的最後一個聲明。你不能像這樣使用宏,並在運行時改變它,宏在編譯之前應該被定義。

+0

嗨亨利感謝您response.Can請你讓我知道是有目標C中的任何其它概念,這將有助於我實現我的要求。 – Naresh

+0

您的要求是什麼?您尚未在運行時明確說明您想要如何使用操作系統版本。 –

-1

嘗試用

if([[[UIDevice currentDevice] systemVersion] floatValue] == 7.0) 
0

您使用Objective-C的預處理器在完全相同的方式在C或C++。預處理器不關心你的if/else語句。它看到#undef,#define,#undef,#define的序列,並依次執行它們,所以在最後一行中,最後一個#define有效。您無法在運行時影響這些#defines。

總是有三種操作系統版本在使用:部署目標(即允許應用程序運行的最低操作系統版本),SDK版本以及運行時的實際版本。你在Xcode中設置的前兩個;實際版本顯然超出了您的控制範圍,除非您知道它與部署目標相同或更高。

__IPHONE_OS_VERSION_MIN_REQUIRED =部署目標 __IPHONE_OS_VERSION_MAX_ALLOWED = SDK版本