您需要运行时检查,而不是使用编译时检查。这意味着您不能使用#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"];
}
}
编辑:因为这些需要是全局的,你应该这样做:
常量.h:
extern UIImage *kHamburgerImage;
@interface Constants
@end
常数.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];
这可以确保调用初始化程序并设置常量,然后再在代码中的其他任何地方使用它们。