ObjC 基础-属性/方法参数关键字(nonnull、nullable、null_resettable、null_unspecified) 的用法与区别

本文介绍了iOS 9引入的关键字用于属性、方法参数和返回值的修饰,如nonnull、nullable、null_resettable和null_unspecified,以及如何通过NS_ASSUME_NONNULL_BEGIN/END简化开发。同时,详细讲解了nullability规则和开发实践中的应用实例。

iOS9新增关键字

可以用来修饰属性、方法的参数、方法的返回值。* 只能修饰指针类型,不能修饰基本数据类型

  • nonnull:表示修饰的属性或参数不能为空。
  • nullable:表示修饰的属性或参数可以为空(默认属性)。
  • null_resettable:表示修饰的属性,getter方法一定不能返回为空, setter可以为空。
  • null_unspecified:表示修饰的属性或参数不确定是否为空。

nullable

表示修饰的属性或参数可以为空(默认属性)。

  • 修饰方式:
// 方式一:
@property (nonatomic, copy, nullable) NSString *name1;
// 方式二:
@property (nonatomic, copy) NSString *_Nullable name2;
// 方式三:
@property (nonatomic, copy) NSString *__nullable name3;
  • 修饰方法方式:
// 方式一:
- (nullable NSString *)funcFirstName:(nullable NSString *)name;
// 方式二:
- (NSString * _Nullable)funcSecondName:(NSString * _Nullable)name;
// 方式三:
- (NSString * __nullable)funcThirdName:(NSString * __nullable)name;

nonnull

表示修饰的属性或参数不能为空。

  • 修饰属性方式:
// 方式一:
@property (nonatomic, copy, nonnull) NSString *name;
// 方式二:
@property (nonatomic, copy) NSString * _Nonnull name;
// 方式三:
@property (nonatomic, copy) NSString * __nonnull name;
  • 修饰方法方式:
// 方式一:
- (nonnull NSString *)funcFirstName:(nonnull NSString *)name;
// 方式二:
- (NSString * _Nonnull)funcSecondName:(NSString * _Nonnull)name;
// 方式三:
- (NSString * __nonnull)funcThirdName:(NSString * __nonnull)name;
  • 区域设置(Audited Regions):

实际开发中,如果需要每个属性或每个方法的参数和返回值都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻开发者的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END

苹果用这两个宏来统一给属性和方法参数和返回值加上nonnull修饰,NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END之间,定义的所有对象属性和方法默认都是nonnull

为了安全起见,苹果还制定了几条规则:

1.typedef定义的类型的nullability特性通常依赖于上下文,即使是在Audited Regions中,也不能假定它为nonnull。
2.复杂的指针类型(如id)必须去指定是nonnull还是nullable。
3.我们经常使用的NSError通常是被假定为是一个指向可以为空的对象(NSError)。

null_resettable

表示修饰的属性,getter方法一定不能返回为空, setter可以为空。

  • 修饰属性方式:
@property (nonatomic, strong, null_resettable) NSString *name;

null_unspecified

表示修饰的属性或参数不确定是否为空。

  • 修饰属性方式:
// 方式一:
@property (nonatomic,strong) NSNumber*_Null_unspecified height1;
// 方式二:
@property (nonatomic,strong) NSNumber*__null_unspecified height2;
// 方式三:
@property (nonatomic,strong,null_unspecified) NSNumber* height3;
  • 修饰方法方式:
// 方式一:
- (null_unspecified NSNumber *)funcHeight1:(null_unspecified NSNumber *)height;
// 方式二:
- (NSNumber * _Null_unspecified)funcHeight2:(NSNumber * _Null_unspecified)height;
// 方式三:
- (NSNumber * __null_unspecified)funcHeight3:(NSNumber * __null_unspecified)height;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值