#ifdef макросы для контроля версий

Я использую макросы, чтобы различать версии, но я не могу заставить его работать правильно. Я использовал:

#ifdef _IPHONE_4_0
  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
 #else
  [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
 #endif

а также

#if __IPHONE_OS_VERSION_MAX_ALLOWED < _IPHONE_4_0
  [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
 #else
  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
 #endif

а также

#if defined(__IPHONE_4_0)
  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
 #else
  [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
 #endif

Какой бы версией я не пользовался - всегда вызывается только одна из строк. И всегда определяется __IPHONE_4_0. Любые идеи?

С уважением, Дмитрий М.


person Dmitry    schedule 31.07.2010    source источник


Ответы (2)


Директивы процессора #if… разрешаются во время компиляции. Пока вы компилируете для SDK 4.0, всегда будет выбираться вариант 4.0.

Если вы хотите, чтобы приложение работало для ‹ 4.0, вам следует использовать проверку во время выполнения:

UIApplication* app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(setStatusBarHidden:withAnimation:)])
  [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
else
  [app setStatusBarHidden:YES animated:YES];
person kennytm    schedule 31.07.2010
comment
Спасибо за ответ. а в таком случае нафига эти макросы вообще можно использовать? Я думал, что __IPHONE_OS_VERSION_MAX_ALLOWED будет отличаться для одного и того же приложения, разрушающегося в разных ОС. нет? - person Dmitry; 31.07.2010
comment
Боже нет. Макросы влияют только на состояние компилятора — как только приложение скомпилировано, они исчезают в тумане оперативной памяти и больше не влияют на приложение. В этом случае Apple использует их, чтобы различать цели компиляции, чтобы один заголовочный файл можно было использовать для нескольких целей и, среди прочего, выдавать полезные ошибки и предупреждения. - person Jonathan Grynspan; 31.07.2010

Небольшое изменение -

Следующий код должен работать:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_4_0   
       [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
 #else   
       [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
 #endif

Пожалуйста, обратите внимание, что это __IPHONE_4_0, а не _IPHONE_4_0.

person Rajendra Prabhu    schedule 15.11.2010