0

嗨,在我的一个应用程序中,我必须为 IOS6 和 IOS7 支持该应用程序。首先,我必须知道当前的设备版本。为此,我定义了一个宏,并尝试使用该宏作为参考来完成我的任务。我写的代码如下。

在 .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 之后打印成这样知道为什么宏值会这样变化。

4

3 回答 3

1

You shouldn't be hardcoding against the OS version, Apple recommended way of supporting multiple OS versions is to check for some specific class, API, protocol or function, this allows for greater flexibility as some of that stuff is sometimes backwards compatible.

Here's a pretty decent tutorial on how to check for existence of specific resources in code http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices and the docs from Apple https://developer.apple.com/library/ios/documentation/developertools/conceptual/cross_development/Using/using.html

EDIT: To answer your question on why the macro is changed, the compiler goes over both branches of the if-else, thus the last declaration of the macro is used. You can't use a macro like that and change it during runtime, macros are meant to be define before compilation.

于 2013-10-01T06:33:06.343 回答
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 版本

于 2014-03-06T09:23:52.607 回答
-1

Try with

if([[[UIDevice currentDevice] systemVersion] floatValue] == 7.0)
于 2013-10-01T06:36:47.840 回答