Согласно Apple Blog ("Nullability and Objective-C") , вы можете использовать
NS_ASSUME_NONNULL_BEGINи NS_ASSUME_NONNULL_END.
Внутри этих регионов будет считаться любой простой тип указателя nonnull. Затем вы можете просто добавить nullableобъект, допускающий значение NULL, например
NS_ASSUME_NONNULL_BEGIN
@interface MyClass: NSObject
- (void)methodWithArg:(NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
@end
NS_ASSUME_NONNULL_END
- если ошибка является
NSError **типом, должно бытьNSError * _Nullable * _Nullable
- если объект является
id *типом, лучше использовать id _Nullable * _Nonnull, это зависит (может быть, вам нужен _Nullable id * _Nullableтип).
- если объект является
NSObject *типом, вам нужно поставить аннотацию после указателя, напримерNSObject * _Nullable * _Nonnull
Заметка
_Nonnullи _Nullableдолжен использоваться после указателя или id(Apple делает это в примере кода AAPLListItem * _Nullable), но формы без подчеркивания nonnullи nullableмогут использоваться после открытой круглой скобки.
Однако в общем случае существует гораздо более удобный способ написать эти аннотации: в объявлениях методов вы можете использовать формы без подчеркивания nullableи nonnullсразу после открытой круглой скобки, если тип является простым указателем на объект или блок.
дополнительные сведения см. в разделе «Возможность обнуления и цель-C»
В целях безопасности из этого правила есть несколько исключений:
typedefТипы обычно не имеют присущей им возможности обнуления - они легко могут быть либо обнуляемыми, либо не обнуляемыми в зависимости от контекста. Следовательно, typedefтипы не предполагаются nonnullдаже в проверенных регионах.
- Более сложные типы указателей, например,
id *должны быть явно аннотированы. Например, чтобы указать указатель, не допускающий значения NULL, на ссылку на объект, допускающий значение NULL, используйте _Nullable id * _Nonnull.
- Конкретный тип
NSError **так часто используется для возврата ошибок через параметры метода, что всегда предполагается, что это указатель, допускающий значение NULL, на NSErrorссылку, допускающую значение NULL .
Чем _Nullable id * _Nonnullможно запутаться, id _Nullable * _Nonnullлучше разбираться.
_Nonnullи _Nullableдолжен использоваться после указателя или id(Apple делает в примере кодаAAPLListItem * _Nullable )
NSError **шрифтом? Кажется, я не могу сделать компилятор счастливым.