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

时间:2017-04-16 17:30:16

标签: objective-c xcode cocoa

更新到Xcode 8.3后,我在macOS SDK标题中收到了许多新的可空性警告。例如

CoreText.framework/Headers/CTRubyAnnotation.h:175:5: warning: inferring '_Nonnull' for pointer type within array is deprecated [-Wnullability-inferred-on-nested-type] CFStringRef text[kCTRubyPositionCount] ) CT_AVAILABLE(10_10, 8_0);

CoreGraphics.framework/Headers/CGColorSpace.h:175:13: warning: array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness-on-arrays]

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

以下是编译生成警告文件的命令的-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

这是我项目中的警告(左)与警告和新创建的项目(右)之间的区别:

Warnings diff

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

2 个答案:

答案 0 :(得分:0)

通过支持您的前缀标题来抑制框架导入的警告:

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

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

#pragma clang diagnostic pop

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

答案 1 :(得分:-2)

Apple会在系统标题中添加更多可空性注释,因为代码会针对可空性行为进行审核,这并不罕见。

默认项目模板没有打开一些有用的警告也并不罕见。

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

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