Подтвердить что ты не робот

"Инициализатор удобства не имеет" собственного "вызова другому инициализатору"

Я пытаюсь преобразовать свой код в проект 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;
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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