Использование __IPHONE_7_0 и RespondsToSelector

Я наткнулся на этот код, и мне было интересно, если проверка #ifdef является избыточной.

UIButton *doneButton = [[UIButton alloc] init];
...

#ifdef __IPHONE_7_0
    if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        [doneButton setContentEdgeInsets:UIEdgeInsetsMake(0, 12, 0, -12)];
#endif

Я попытался удалить его и запустить в iOS 6, и он работал нормально. Есть ли какой-то особый случай, о котором мне нужно знать в iOS 6/7, который не вызывает его срабатывания или вызывает сбои?

2 ответа

Решение

#Ifdef - это директива времени компиляции. Это приведет к тому, что код между #ifdef и #endif будет скомпилирован, только если проект построен на основе iOS 7 SDK. Если вы создаете на основе iOS 6 SDK, код не будет компилироваться вообще.

#Ifdef предотвратит ошибки компилятора, если код внутри использует символы, которые определены только в iOS 7 SDK. В коде, который вы разместили, я не уверен, что он делает. Код setContentEdgeInsets действителен для большинства версий iOS. Я думаю, что код должен проверить, отвечает ли self на setEdgesForExtendedLayout, а затем вызвать setEdgesForExtendedLayout, если он отвечает.

#ifdef избыточно Кроме того, в зависимости от того, как __IPHONE_7_0 определено, это может привести к тому, что ваше приложение перестанет работать на iOS 8. Просто удалите его.

Другие вопросы по тегам