以下关键字只能修饰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