Отключите назначенную проверку инициализатора в Xcode 6

Я получаю ошибку компиляции:

error: convenience initializer missing a 'self' call to another initializer [-Werror,-Wobjc-designated-initializers]

Назначенные инициализаторы с проверкой компиляции могут быть полезны, но если я не хочу иметь дело с этим прямо сейчас, как я могу отключить это?

2 ответа

Решение

Способ 1

В вашем проекте:

  1. Отредактируйте настройки сборки для своей цели (⌘-1, выберите проект или см. Apple docs).
  2. Поиск "Другие предупреждающие флаги".здесь, эй
  3. добавлять -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.

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