iOS关键字用法 - nullability annotations

以下关键字只能修饰strong/copy/block指针类型的对象,不能修饰assign基本数据类型
使用关键字好处: 提高代码规范, 减少BUG几率

  • 不允许为空
//  nonnull、_Nonnull、__nonnull 
@property (nonatomic, copy, nonnull) NSString *name;
@property (nonatomic, copy) NSString * _Nonnull name;
@property (nonatomic, copy) NSString * __nonnull name;
- (nonnull NSString *)funcName:(nonnull NSString *)name;
- (NSString * _Nonnull)funcName:(NSString * _Nonnull)name;
typedef void (^BlockHandler)(NSArray * _Nonnull list, NSError * _Nonnull error);
  • 可以为空
// nullable、_Nullable、__nullable
@property (nonatomic, copy, nullable) NSString *name;
@property (nonatomic, copy) NSString * _Nullable name;
@property (nonatomic, copy) NSString * __nullable name;
- (nullable NSString *)funcName:(nullable NSString *)name;
- (NSString * _Nullable)funcName:(NSString * _Nullable)name;
typedef void (^BlockHandler)(NSArray * _Nullable list, NSError * _Nullable error);
  • get不能为空,set可以为空
// null_resettable 
使用null_resettable关键字的属性, 必须重写get方法或者set方法, 处理传递的值为空的情况

@property (nonatomic, copy, null_resettable) NSString *name; 

- (NSString *)name {
    if (_name == nil) {
        _name = @"DefaultName";
    }
    return _name;
}
  • 未知是否为空
// null_unspecified、__null_unspecified、_Null_unspecified 
@property (nonatomic, strong, null_unspecified) NSString *name;
@property (nonatomic, strong) NSString *__null_unspecified name; 
@property (nonatomic, strong) NSString *_Null_unspecified name;
  • 某区域关键字统一声明

为了简化关键字声明的过程,通常使用NS_ASSUME_NONNULL_BEGIN、NS_ASSUME_NONNULL_END来声明代码区域之间的所有对象属性和方法默认为nonnull, 需要为nil的地方手动设为nullable。


NS_ASSUME_NONNULL_BEGIN

@interface Person: NSObject

// nonnull
@property (nonatomic, strong) NSString *name;
// nullable
@property (nonatomic, strong, nullable) NSString *identify;

@end

NS_ASSUME_NONNULL_END
  • 复杂指针

复杂的指针类型(如id *)必须显示去指定是nonnull还是nullable。例如,指定一个指向nullable对象的nonnull指针,可以使用__nullable id * __nonnull

参考资料:

iOS9的几个新关键字
iOS关键字详解
Nullability and Objective-C

你可能感兴趣的:(iOS关键字用法 - nullability annotations)