【问题标题】:How to use preprocessors in objective c如何在目标 c 中使用预处理器
【发布时间】:2014-03-06 17:23:52
【问题描述】:

您好,在我的一个应用程序中,我必须支持该应用程序的 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 之后打印成这样知道为什么宏值会这样变化。

【问题讨论】:

    标签: ios preprocessor


    【解决方案1】:

    您不应该针对操作系统版本进行硬编码,Apple 推荐的支持多个操作系统版本的方法是检查某些特定的类、API、协议或函数,这样可以提供更大的灵活性,因为其中一些内容有时是向后兼容的.

    这是一个相当不错的教程,介绍如何检查代码 http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices 中是否存在特定资源以及来自 Apple 的文档 https://developer.apple.com/library/ios/documentation/developertools/conceptual/cross_development/Using/using.html

    编辑:要回答您关于为什么更改宏的问题,编译器会遍历 if-else 的两个分支,因此使用宏的最后一个声明。您不能使用这样的宏并在运行时更改它,宏是在编译之前定义的。

    【讨论】:

    • 嗨,Henri,感谢您的回复。您能否告诉我目标 c 的任何其他概念可以帮助我实现我的要求。
    • 您的要求是什么?您没有明确说明您想在运行时对操作系统版本执行什么操作。
    【解决方案2】:

    您在 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 版本

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 2019-02-03
        • 2014-02-24
        • 1970-01-01
        • 2020-12-14
        • 2012-12-29
        • 2011-02-10
        相关资源
        最近更新 更多