Objective-C中nullable、__nullable、_Nullable、_Nonnull的用法

Xcode 6.3引入的一个Objective-C的新特性:nullability annotations
swift用!和?来区分optional和non-optional
swift 和OC混编时,swift不知道OC的类型,默认non-optional

nullable: 表示修饰的属性或参数可以为空,书写方式有三种:

@property(nonatomic,strong,nullable) NSString * name;
@property(nonatomic,strong) NSString *_Nullable name;
@property(nonatomic,strong) NSString *__nullable name;

nonnull:非空,表示修饰的属性或参数不能为空,书写方式有三种:

@property(nonatomic,strong,nonnull) NSNumber * price;
@property(nonatomic,strong) NSNumber *_Nonnull price;
@property(nonatomic,strong) NSNumber *__nonnull price;

注意:nonnull,nullable只能修饰对象,不能修饰基本数据类型

在方法中使用nullable和nonnull:

 - (nullable NSString *)buyBook:(nullable NSString *)book;
 - (NSString *__nullable)buyBook:( NSString *__nullable)book;
 - (NSString *_Nullable)buyBook:( NSString *_Nullable)book;
- (nonnull NSString *)buyBook:(nonnull NSString *)book;
 - (NSString *__nonnull)buyBook:( NSString *__nonnull)book;
 - (NSString *_Nonnull)buyBook:( NSString *_Nonnull)book;

Nonnull区域设置(Audited Regions)
在查看苹果iOS各种开发框架的头文件时,我们发现都是用nullable修饰的属性和方法,为什么都没看到nonnull修饰的属性和方法呢?
事实上,如果需要每个属性或每个方法的参数和返回值都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。苹果用NS_ASSUME_NONNULL_BEGIN,NS_ASSUME_NONNULL_END这两个宏来统一给属性和方法参数和返回值加上nonnull修饰,NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END之间,定义的所有对象属性和方法默认都是nonnull。下图所示:

《Objective-C中nullable、__nullable、_Nullable、_Nonnull的用法》 屏幕快照 2018-08-25 下午3.59.22.png

参考:

https://www.jianshu.com/p/1f672a441052

    原文作者:crazyfox
    原文地址: https://www.jianshu.com/p/2d5f07424412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞