Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
// !!!: Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
-(NSString *)hoge:(NSString *)hoge;
@property (nonatomic) NSString *foo;
@property (nonatomic) NSString *bar;
void function(NSString *str);
Objective-Cに新たに取り入れられた「Nullability」という仕組みが原因です。
解決方法1
ヘッダーファイル内で一つでもnullable
やnonnull
, _Nullable
, _Nonnull
等のキーワードを利用するとこのような警告が発生します。それらを削除すれば警告は消えますが、それでも警告が消えない場合は、全ての型名にNullability属性を指定する必要があります。> 解決方法2、> 解決方法3を試してみてください。
解決方法2
警告発生箇所があまりにも多い場合は、ヘッダーファイル内のコードをNS_ASSUME_NONNULL
属性で囲ってあげると、とりあえず警告は回避できます。
NS_ASSUME_NONNULL_BEGIN
@interface SuperMan
-(NSString *)hoge:(NSString *)hoge;
@property (nonatomic) NSString *foo;
@property (nonatomic) NSString *bar;
void function(NSString *str);
@end
NS_ASSUME_NONNULL_END
この場合、各プロパティーはnilの代入を厳しくチェックするようになりますので、nilを容認するプロパティには個別にnullable
属性や_Nullable
属性を追加する必要が出てきます。
-(NSString *)hoge:(nullable NSString *)hoge;
@property (nonatomic, nullable) NSString *foo;
void function(NSString *_Nullable str);
解決方法3
Nullability属性を個別に指定する方法もあります。 Objective-Cのメソッド・プロパティーとC言語の関数や変数で異なるキーワード使っている点に注意してください。
-(nonnull NSString *)hoge:(nullable NSString *)hoge;
@property (nonatomic, nonnull) NSString *foo;
@property (nonatomic, nullable) NSString *bar;
void function(NSString *_Nullable str);
@interface Hoge : NSString {
NSString *_Nonnull _buz;
}
@end
Nullability記法まとめ
上記サンプルの通り、Objective-Cのメソッド・プロパティーとC言語の関数・変数では異なるキーワードを用います。以下の対応表を参考にしてください。
メソッド/プロパティー | 変数・関数 | |
---|---|---|
nil/null 可 | nullable | _Nullable |
nil/null 不可 | nonnull | _Nonnull |
補足
weak属性のプロパティーにnonnullオプションを利用するとエラーになります。
@property (nonatomic, weak , nonnull) NSString *foo; // Error: Property attributes 'nonnull' and 'weak' are mutually exclusive
@property (nonatomic, strong, nonnull) NSString *foo; // OK
weakプロパティはオブジェクト解放時にnilに変化するという性質があるため、「nilを受け付けない・nilを返さない」ことを保証するためのnonnullが指定できないというのも頷けます。