"Удобный инициализатор пропускает вызов" self "другому инициализатору"

Я пытаюсь преобразовать свой код в проект iOS 8, и мне нужно объяснить, как исправить это предупреждение: "Convenience initializer missing a 'self' call to another initializer"

по этому коду:

-(instancetype) initWithCoder:(NSCoder *)aDecoder // warning: Convenience initializer missing a 'self ' call to another initializer
{
    if (self = [super initWithCoder:aDecoder]) // warning: convenience initializer should not invoke an initializer on 'super'
    {
    // some init stuff here
    }
    return self;
}

2 ответа

Решение

Новая поставка Clang с Xcode 6 позволяет принудительно назначать инициализаторы с помощью макроса NS_DESIGNATED_INITIALIZER. Когда он отмечает любой из методов семейства init в объявлении класса, все остальные инициализаторы считаются "вторичными" (если использовать терминологию Apple) инициализаторами. То есть они должны вызывать друг к другу назначенный или вторичный инициализатор, пока не достигнут назначенного инициализатора.

UIView ничего не помечает как назначенный инициализатор, поэтому где-то вы объявили другой метод init класса в качестве назначенного инициализатора. Из-за этого инициализатор NSCoder становится помеченным как вторичный и генерирует предупреждение. Я подал радар (rdar://17559176) об этом, но до тех пор его можно отключить для каждого файла, указав -Wno-objc-designated-initializersили предоставив соответствующий диагностический push-pop с -Wobjc-designated-initializers,

Просто дополнение к тому, что говорит @CodaFi:

  • Один фрагмент документов Apple, которые я нашел на указанных инициализаторах, находится здесь.
  • Я ответил на вопрос о том, как подавить эти предупреждения, с помощью еще нескольких вариантов. Мне особенно нравится метод скомпилированного заголовка (#2), потому что он напоминает вам, чтобы исправить это.
Другие вопросы по тегам