コンパイル時チェックを使用する代わりに、実行時チェックが必要です。これは、使用できないことを意味します#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];
これにより、コード内の他の場所で使用する前に、初期化子が呼び出され、定数が設定されます。