17

我收到编译错误:

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

经过编译检查的指定初始化程序可能是一件好事,但如果我现在不想处理它,我该如何关闭它呢?

4

2 回答 2

36

继克莱的回答之后..

方法三

您可能希望在一次出现时抑制警告,而不是全部:

#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方法没有被覆盖,请使用NS_UNAVAILABLE向您的标头添加一个init方法。

于 2014-11-26T10:35:27.447 回答
18

方法一

在您的项目中:

  1. 编辑目标的构建设置(⌘-1,选择项目,或参见Apple 文档)。
  2. 搜索“其他警告标志”。 在这里,哟
  3. 添加-Wno-objc-designated-initializers.

您还可以-Wobjc-designated-initializers根据每个文件或使用 clang 诊断推送和弹出来对此进行某种组合(参见下面的@bandejapaisa 的“方法 3”答案)。

方法二

此方法允许您在 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

OS X 10.10的模拟是.__IPHONE_8_0__MAC_10_10

为什么?

如果您对这些消息存在的原因感兴趣,可以查看此 SO 答案 或这些Apple 文档

于 2014-08-21T15:00:53.933 回答