使用CLANG_ANALYZER_NONNULL
(即-Xclang nullability
),我得到了「空是從預計將返回一個非空值函數返回」:'[UIView initWithFrame:]'的衝突文檔:可爲空還是非空?
使用的Xcode 7.3和iOS 9.3的文檔,我檢查initWithFrame:
它可以返回nil
:
但UIView.h封裝用的一切NS_ASSUME_NONNULL_BEGIN
,所以我們可以解釋如下:
爲:
- (nonnull instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
所以文檔解釋了它的nullable
,而頭文件說,這是nonnull
。哪一個信任?
我應該寫:
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (!self) {
// workaround for clang analyzer
return (void * _Nonnull)nil;
}
// Initialization code
return self;
}
或者:
- (nonnull instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
// Initialization code
return self;
}
UPDATE
Xcode中的文檔進行了更新,現在是:
所以沒有更多的衝突。
這取決於你的意思是「信任」。編譯器(和相關工具)將「信任」註釋,而不是文檔。如果你希望你的代碼在沒有警告的情況下通過,並且不讓Swift用戶頭疼,那麼假設'nonnull'屬性是正確的。 – Avi
面對'[NSURL URLWithString:]'類似的問題,因爲聲明希望該字符串爲'nonnull',但描述指出它可以是'nil'。 –