컴파일 타임 검사를 사용하는 대신 런타임 검사가 필요합니다. 즉, #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];
이것은 호출되는 초기화를 보장하고 코드에서 다른 곳을 사용하기 전에 상수가 설정이다.
이 작업을 수행 할 수 없습니다. iOS 버전은 컴파일 타임 결정이 아닌 런타임 결정이어야합니다. – rmaddy
@rmaddy 죄송합니다! 나는 정상적으로 작동하지만 정상적인 코드에서는 작동하지만 #define은 작동하지 않는다고 생각합니다 ... – Undo
Xcode의 두 가지 버전으로 코드를 빌드 할 수 없도록하는 경우가 아니라면 런타임 검사를 사용해야합니다. 시간 체크를 컴파일하지 않습니다. '# if'와'#define'은 모두 컴파일 타임 기능입니다. – rmaddy