在Xcode 6中关闭指定的初始化程序检查

Cla*_*ges 16 xcode objective-c suppress-warnings designated-initializer

我收到了编译错误:

error: convenience initializer missing a 'self' call to another initializer [-Werror,-Wobjc-designated-initializers]
Run Code Online (Sandbox Code Playgroud)

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

ban*_*isa 34

以下是Clay的回答..

方法3

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

#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
Run Code Online (Sandbox Code Playgroud)

编辑:但是,我实际上只使用过一次.如果它是一个案例,我发现它只是为了正确地做到这一点(或者更多一点)努力.因此,使用NS_DESIGNATED_INITIALIZER标记构造函数.如果它然后抱怨init方法没有被覆盖,则使用NS_UNAVAILABLE向头部添加init方法.


Cla*_*ges 18

方法1

在您的项目中:

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

您也可以对此进行一些组合,也可以-Wobjc-designated-initializers基于每个文件或使用clang诊断推送和弹出(参见下面的@ bandejapaisa的"方法3" 答案).

方法2

此方法允许您在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
Run Code Online (Sandbox Code Playgroud)

模拟__IPHONE_8_0为OS X 10.10是__MAC_10_10.

为什么?

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