Использование __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. Просто удалите его.