如何#define基于iOS版本?

时间:2013-07-24 23:27:39

标签: ios objective-c c-preprocessor ifdefine

我的应用中有一个Constants.h文件,我在#define应用范围之内,以便以后轻松访问。不过,我很难过#define基于iOS版本。这是我尝试过的:

#ifdef __IPHONE_7_0

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];

#else

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];

#endif

仅仅因为它说iOS 7并不意味着这是在NDA之下,O闭门器!

哪种方法正常 - 适用于iOS 7的 。但是,当我在iOS 6上运行我的应用时,#define仍然是iOS 7 - 似乎#ifdef似乎从未被考虑过。

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:7)

您需要运行时检查,而不是使用编译时检查。这意味着您无法使用#define。我建议使用一个基于iOS版本在运行时初始化的静态变量。如果您只需要单个文件中的值,则下面是一个示例。

一些.m文件:

static UIImage *kHamburgerImage = nil;

+ (void)initialize {
    // This assumes you only support iOS 6 and later - adjust as needed
    if ([[UIDevice currentDevice].systemVersion hasPrefix:@"6"]) {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
    } else {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
    }
}

编辑:由于这些必须是全局变量,所以你应该这样做:

Constants.h:

extern UIImage *kHamburgerImage;

@interface Constants
@end

Constants.m:

UIImage *kHamburgerImage = nil;

@implementation Constants

+ (void)initialize {
    // This assumes you only support iOS 6 and later - adjust as needed
    if ([[UIDevice currentDevice].systemVersion hasPrefix:@"6"]) {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
    } else {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
    }
}

@end

但是这有一个问题。除非您采取特定步骤,否则访问这些全局变量可能会产生nil指针。如果实际引用了类,它们只会被初始化。我建议您作为application:didFinishLaunchingWithOptions:的第一行:

[Constants class];

这样可以确保在代码中的任何其他位置使用它们之前调用初始化程序并设置常量。

答案 1 :(得分:6)

您可以通过将iOS检查定义为宏来至少缩短代码。

#define IS_IOS7 [[UIDevice currentDevice].systemVersion hasPrefix:@"7"]

然后你的新代码更易读,

if (IS_IOS7) {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
} else {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
}

答案 2 :(得分:2)

您应该使用#ifndef而不是#ifdef。这是代码。我希望它会对你有所帮助。

#ifndef __IPHONE_7_0

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];

#else

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];

#endif