2015년 5월 8일 금요일

[Xcode] 플랫폼 구분 전처리기(Preprocessor)

플랫폼(Platform), 즉 현재 프로젝트의 타겟 OS가 OSX 이냐 아니면 iOS냐를 구분하는 전처리기를 정리한다. 기존의 Swift 글에서도 정리했던 적이 있지만 Objective-C 코드에서도 종종 사용되기에 별도로 정리한다.

Swift의 경우

딱히 설명이 필요 없을 것 같다.
#if os(iOS)
    // ... iOS 용 코드 ...
#elseif os(OSX)
    // ... OSX 용 코드 ...
#else
    // ... 현재는 이 경우에 걸리는 경우는 없을거라 생각된다 ...
#endif
스위프트에서 사용하는 경우에는 플랫폼이 딱 맞게 떨어진다. 이 말이 무슨 말인지 모르겠다면 Objective-C의 경우와 비교해 보자. =_=;;

Objective-C의 경우

Objective-C로 코딩하는 경우 C식의 룰을 따라 역시 비슷하게 #if 문을 이용해 TARGET_OS_IPHONE 등등의 전처리기를 이용 할 수 있다. 아마도 아래와 같은 4가지만 정리하면 될 것 같다:
  • TARGET_OS_MAC
  • TARGET_OS_IPHONE: iOS 디바이스 혹은 시뮬레이터
  • TARGET_IPHONE_SIMULATOR: iOS 시뮬레이터
  • TARGET_OS_EMBEDDED: iOS 디바이스
하지만 상황에 따라 이게 먹히거나 먹히지 않거나 등등 다양한 상황이 발생하는데 이는 TargetConditionals.h 라는 헤더 파일의 임포트 여부에 따라 달라진다. 따라서 명확하게 하기 위해 이 헤더를 미리 임포트 한 뒤에 플랫폼 파악용 전처리기를 사용해야 한다.
#import "TargetConditionals.h"

#if TARGET_OS_IPHONE
    // iOS 디바이스 혹은 시뮬레이터
#else
    // OSX 등등
#endif
스위프트의 경우와 다른점이 있다면 TARGET_OS_MAC의 값이다. 개인적으론 이 TARGET_OS_MAC 플래그는 사용하지 않는걸 권한다. 왜냐하면 이 플래그는 OSX나 iOS나 시뮬레이터를 가리지 않고 무조건 1이기 때문이다. (뭥미?!!!)

결국 TARGET_OS_IPHONE 만을 이용해 파악하면 왠만하면 문제없이 플랫폼 구분이 가능 할 것이다.

관련글: Swift - 유용한 전처리기(Preprocessor)

댓글 없음 :