Отключите назначенную проверку инициализатора в Xcode 6
Я получаю ошибку компиляции:
error: convenience initializer missing a 'self' call to another initializer [-Werror,-Wobjc-designated-initializers]
Назначенные инициализаторы с проверкой компиляции могут быть полезны, но если я не хочу иметь дело с этим прямо сейчас, как я могу отключить это?
2 ответа
Способ 1
В вашем проекте:
- Отредактируйте настройки сборки для своей цели (⌘-1, выберите проект или см. Apple docs).
- Поиск "Другие предупреждающие флаги".
- добавлять
-Wno-objc-designated-initializers
,
Вы также можете сделать некоторую комбинацию этого и -Wobjc-designated-initializers
для каждого файла или с помощью диагностических нажатий и щелчков Clang (см. "Метод 3" ответа @ bandejapaisa ниже).
Способ 2
Этот метод позволяет вам переключаться между Xcode 5 и 6, а также предоставляет вам напоминание, чтобы исправить назначенные вещи инициализатора.
Для разработки iOS, поместите это в свой .pch
Файл (предварительно скомпилированный заголовок):
#ifdef __IPHONE_8_0
// suppress these errors until we are ready to handle them
#pragma message "Ignoring designated initializer warnings"
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
#else
// temporarily define an empty NS_DESIGNATED_INITIALIZER so we can use now,
// will be ready for iOS8 SDK
#define NS_DESIGNATED_INITIALIZER
#endif
Аналог к __IPHONE_8_0
для OS X 10.10 есть __MAC_10_10
,
Зачем?
Если вас интересует, почему существуют эти сообщения, вы можете проверить этот SO-ответ или эти документы Apple.
Исходя из ответа Клэя..
Способ 3
Возможно, вы захотите подавить предупреждение в одном случае, но не во всех из них:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype) initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
// do whatever I was doing....
}
return self;
}
#pragma clang diagnostic pop
РЕДАКТИРОВАТЬ: Тем не менее, я только на самом деле использовал это один раз сам. Я считаю, что это то же самое (или немного больше) усилий, чтобы сделать это правильно, если это один случай. Так что пометьте ваш конструктор с помощью NS_DESIGNATED_INITIALIZER. И если затем он жалуется на то, что метод init не был переопределен, добавьте метод init в свой заголовок с помощью NS_UNAVAILABLE.