[UIView initWithFrame:]的文档冲突:是否可为空?

Cœu*_*œur 6 objective-c uiview ios initwithframe objective-c-nullability

使用CLANG_ANALYZER_NONNULL(ie -Xclang nullability),我得到“ 从预期返回非空值的函数返回Null ”:

在此处输入图片说明

使用Xcode 7.3和iOS 9.3文档,我检查了一下initWithFrame:,它可以返回nil

描述

但是UIView.h用封装了所有内容NS_ASSUME_NONNULL_BEGIN,因此我们可以解释以下内容:

接口

如:

- (nonnull instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)

因此文档说明了nullable,而标头文件说明了nonnull。信任哪一个?

我应该写:

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) {
        // workaround for clang analyzer
        return (void * _Nonnull)nil;
    }
    // Initialization code
    return self;
}
Run Code Online (Sandbox Code Playgroud)

要么:

- (nonnull instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    // Initialization code
    return self;
}
Run Code Online (Sandbox Code Playgroud)

更新

Xcode文档已更新,现在为: initWithFrame:文档

因此,不再有冲突。

小智 3

对于UIView-initWithFrame初始化程序,建议不要防御性地检查调用超级初始化程序的结果,因为应用程序实际上无法执行任何操作来从失败的UIView分配中恢复。

此外,从 Xcode 7.3 beta 4 开始,静态分析器不再在此处发出警告。现在,即使这些方法具有带类型限定符的返回类型,它也不会警告从-init-copy和系列返回 nil ,以避免针对这种常见的防御习惯用法发出警告。-mutableCopynonnull