Objective-C中的nullable、__nullable、__Nullable

nullable、__nullable、_Nullable 都表示对象可以是NULL或nil

nonnull、__nonnull、_Nonnull 都表示对象不应该为空

它们是Obective-C特性Nullability Annotations,如果我们在编码时不遵循这一规则时,编译器会给出警告。三种表示作用是相同的,在使用时位置会有差别。举例如下:

方法返回值的修饰:

- (nullable id)method;
- (id __nullable)method;
- (id _Nullable)method;

声明属性的修饰

@property (nonatomic, strong, nullable) id obj;
@property (nonatomic, strong) id __nullable obj;
@property (nonatomic, strong) id _Nullable obj;

方法参数的修饰

- (void)methodWithObject:(nullable id)obj;
- (void)methodWithObject:(id _Nullable)obj;
- (void)methodWithObject:(id __nullable)obj;

双指针类型的对象、Block的返回值、Block的参数等需要使用 __nullable、__Nullable 或者 __nonnull、__Nonnull

双指针类型的参数

- (void)methodWithError:(NSError * _Nullable * _Nullable)error
- (void)methodWithError:(NSError * __nullable * __nullable)error

block的修饰

下例使用nullable、__nullable、_Nullable修饰的block表示 methodWithBlock 的参数可以为空block。

- (void)methodWithBlock:(nullable void (^)())block; 
- (void)methodWithBlock:(void (^ _Nullable)())block;
- (void)methodWithBlock:(void (^ __nullable)())block;

block的参数和返回值

- (void)methodWithBlock:(nullable id __nonnull (^)(id __nullable params))block;
- (void)methodWithBlock:(id __nonnull (^ __nullable)(id __nullable params))block;
- (void)methodWithBlock:(id _Nonnull (^ _Nullable)(id _Nullable params))block;

每次手动写这些很麻烦,我们现在新建的文件会默认添加 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END两个宏,表示在宏之间的代码都是nonnull,如果有nullable都指针对象,我们单独标示出来。

NS_ASSUME_NONNULL_BEGIN

@interface TestClass ()

- (void)methodWithObject:(nullable id)obj;

@end

NS_ASSUME_NONNULL_END

 

你可能感兴趣的:(iOS,MocOS)