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文档已更新,现在为:

因此,不再有冲突。
小智 3
对于UIView的-initWithFrame初始化程序,建议不要防御性地检查调用超级初始化程序的结果,因为应用程序实际上无法执行任何操作来从失败的UIView分配中恢复。
此外,从 Xcode 7.3 beta 4 开始,静态分析器不再在此处发出警告。现在,即使这些方法具有带类型限定符的返回类型,它也不会警告从-init、-copy和系列返回 nil ,以避免针对这种常见的防御习惯用法发出警告。-mutableCopynonnull
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |