Objective c 更新到Xcode 8.3后macOS标头中的可空性警告

Objective c 更新到Xcode 8.3后macOS标头中的可空性警告,objective-c,xcode,cocoa,Objective C,Xcode,Cocoa,在升级到Xcode 8.3之后,我在macOS SDK头中收到了许多新的可空性警告。比如说 CoreText.framework/Headers/CTRubyAnnotation.h:175:5:警告:不推荐为数组中的指针类型推断“\u Nonnull”[-Wnullability推断嵌套类型] CFStringRef文本[kCTRubyPositionCount])CT_可用(10_10,8_0) CoreGraphics.framework/Headers/CGColorSpace.h:17

在升级到Xcode 8.3之后,我在macOS SDK头中收到了许多新的可空性警告。比如说

CoreText.framework/Headers/CTRubyAnnotation.h:175:5:警告:不推荐为数组中的指针类型推断“\u Nonnull”[-Wnullability推断嵌套类型]
CFStringRef文本[kCTRubyPositionCount])CT_可用(10_10,8_0)

CoreGraphics.framework/Headers/CGColorSpace.h:175:13:警告:数组参数缺少可空性类型说明符(\u Nonnull、\u Nullable或\u Nullable\u unspecified)[-数组上的可空性完整性]

我可以抑制警告,但我注意到它们不会出现在新创建的项目中

以下是用于编译生成警告的文件的命令的-W参数:

-Wnon-modular-include-in-framework-module
-Werror=non-modular-include-in-framework-module
-Wno-trigraphs
-Wno-missing-field-initializers
-Wno-missing-prototypes
-Wunreachable-code
-Wno-implicit-atomic-properties
-Wno-arc-repeated-use-of-weak
-Wnon-virtual-dtor
-Wno-overloaded-virtual
-Wno-exit-time-destructors
-Wduplicate-method-match
-Wno-missing-braces
-Wparentheses
-Wswitch
-Wunused-function
-Wno-unused-label
-Wno-unused-parameter
-Wunused-variable
-Wunused-value
-Wempty-body
-Wuninitialized
-Wno-unknown-pragmas
-Wno-shadow
-Wno-four-char-constants
-Wno-conversion
-Wconstant-conversion
-Wint-conversion
-Wbool-conversion
-Wenum-conversion
-Wshorten-64-to-32
-Wno-newline-eof
-Wno-selector
-Wno-strict-selector-match
-Wundeclared-selector
-Wno-deprecated-implementations
-Wno-c++11-extensions
-Wprotocol
-Wdeprecated-declarations
-Winvalid-offsetof
-Wno-sign-conversion
-Winfinite-recursion
-Wmove
-Wreorder
我的项目(左)中的警告与新创建的项目(右)中的警告之间存在差异:


此外,在这两个项目中,基本SDK都设置为最新的macOS(macOS 10.12)。

苹果公司在审查代码的可空性行为时,在系统标题中添加更多缺失的可空性注释,这并不罕见

默认项目模板会有一些有用的警告没有打开,这也很正常

我建议您将新项目中的警告设置与您的项目中的警告设置进行比较。SDK设置还将影响对哪些API进行注释


很有可能,在新项目中,您会收到相同的警告,但默认情况下它们不会打开。

通过如下方式支撑前缀标题来抑制框架导入的警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnullability-completeness"

@import CoreGraphics; // Or some other module that imports CoreGraphics
// ...

#pragma clang diagnostic pop

如果您不使用前缀头,那么,它们在很多方面都很有用。使用它们。

我会说,向苹果公司提交一份缺陷报告。同时,一个简单的解决方法:创建一个新项目,并将所有代码和其他资源拖到其中。我担心我的项目文件太复杂,无法轻松解决(多个目标等)。除了这些警告之外,您的项目是否编译?我注意到,如果我的项目由于其他原因无法编译,我会收到很多错误警告。当我修复这个问题时,警告也消失了。你是否启用了
-Weverything
?@Wevah看起来不像。但是,他明确表示“它们不会出现在新创建的项目中”。但是@matt,我特别说过,新创建的项目在其构建设置中可能会激活/停用警告,这与他的项目不同。类似地,它可能具有不同的SDK集。请务必阅读整个答案,不要在第一句话后否决。然后我认为您有责任说出所讨论的构建设置是什么。否则你只是在猜测,这实际上只是一个评论。我完全同意将新项目中的构建设置与OP自己的项目进行比较是一个好主意,但建议(事实上,在我自己的评论中已经隐含)并不是一个答案。我坐在这里看着构建设置,我看不到任何可能的候选者。你能?