“方便初始化程序错过了对另一个初始化程序的'自我'调用”

时间:2014-06-27 18:27:35

标签: ios ios8 xcode6

我正在尝试将我的代码转换为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 个答案:

答案 0 :(得分:35)

带有Xcode 6的新Clang运输通过NS_DESIGNATED_INITIALIZER宏启用编译器强制指定的初始值设定项。当它在类声明中标记任何一个init-family方法时,所有其他初始值设定项都被认为是" secondary" (使用Apple的术语)初始化程序。也就是说,他们应该互相呼叫指定的或辅助初始化程序,直到它们到达指定的初始化程序。

UIView没有标记为指定的初始化程序,所以在某处你已经将该类的另一个init方法声明为指定的初始化程序。因此,NSCoder的初始化程序被标记为次要并生成警告。我已经提交了一个关于它的雷达(rdar:// 17559176),但在此之前,它可以通过指定-Wno-objc-designated-initializers或通过提供适当的诊断push-pop来基于每个文件关闭。 -Wobjc-designated-initializers

答案 1 :(得分:4)

只是@CodaFi所说的补遗:

  • 我在指定的初始化程序中找到的一片Apple文档是here
  • 我已经回答了一个关于如何抑制这些警告here的问题,还有几个选项。我特别喜欢预编译的头文件方法(#2),因为它会提醒你修复它。