"Удобный инициализатор пропускает вызов" 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), потому что он напоминает вам, чтобы исправить это.