#xcode #conditional-compilation
#xcode #условная компиляция
Вопрос:
У меня есть команда, работающая над некоторым кодом IOS. У одного разработчика (меня) есть Xcode6-beta с несколькими строками специфичного для IOS8 кода. Когда другой разработчик с Xcode5 создает его для IOS7, компиляция завершается неудачно, потому что IOS8 SDK для него не существует.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
// ios8 code
} else {
// ios7 and less way
}
Есть ли способ игнорировать код IOS8 в компиляции Xcode на основе SDK или версии Xcode, чтобы он компилировался?
Ответ №1:
Да, вы можете сделать это с помощью директив:
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
// target is iOS
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
// target is lower than iOS 8.0
#else
// target is at least iOS 8.0
#endif
#endif
Это похоже на закомментирование ненужных строк кода, но автоматически. Компилятор не включает в себя все, что хранится в 8.0-специфичной части if-инструкции.
Ответ №2:
Эта ссылка отличная. Но, короче говоря, спросите объект, если определенный метод respondsToSelector:
if ([self.<object_name> respondsToSelector:@selector(<method_in_question>)]) {
[self.<object_name> <method_in_question>];
}
Это гораздо более динамично, чем проверка фактической версии ОС. Удачи!
Комментарии:
1. Это решение во время выполнения, мое решение работает во время компиляции. ЕСЛИ нет поддержки метода, 100%, почему мы должны проверять его во время выполнения и тратить ресурсы?
2. 1) Я не мог заставить ваш работать за то время, которое у меня было 2) Мне не нравится иметь дело с низкоуровневым кодом. 3) 1 проверка, или 2, или 3, не приведет к замедлению работы приложения и трате ресурсов настолько, чтобы это действительно имело значение, и это было намного проще.
3. Я согласен с вами, но если вы выполните эту проверку несколько раз, это может снизить производительность. Я рассмотрел тот конкретный случай, который был упомянут ответчиком, и у меня возникла идея, что в рабочей версии им не понадобится какой-либо зависящий от версии код. Поэтому я выбрал для этого низкоуровневое решение. Но ваше решение больше предназначено для поддержки нескольких версий.
4. Правда, проверка может снизить производительность, если выполняется несколько раз. В моем конкретном случае этого не будет. Это еще один недостаток вашего решения: оно требует обновления версии. Хотя он может быть более эффективным во время компиляции, он требует дополнительных затрат программиста, что может быть менее желательным, чем более быстрое время компиляции и, возможно, сохранение некоторых проверок во время выполнения. В следующий раз, если вы знаете оба решения, я бы опубликовал их оба.