Objective-C 编程:nullable 与 nonnull 的运用

2019年8月14日

性命是什么呢?性命是每时每刻不知如之奈何。

nullable 与 nonnull 的区分

__nullable:默示工具可以是 NULL 或 nil。

__nonnull:默示工具不可认为空。

__null_unspecified:默示工具未指定、不明确。

若是不显式申明,则默示 __nonnull_Null_unspecified (不明确)

在 Xcode 7 中,为了避免与第三方库的冲突,Apple 把 __nullable/__nonnull 改为了 _Nullable/_Nonnull,也支持不下划线的写法:nullable/nonnull

运用规范:

  1. 对属性、方式前往值、方式参数的润色,运用 nonnull/nullable
  2. 对 C 函数的参数、Block的参数、Block前往值 的润色,运用 _Nonnull/_Nullable,提议弃用 __nonnull/__nullable

为保险起见,Apple 制定的运用划定规矩:

  1. 通过 typedef 界说的范例的 nullability 个性通常依赖于上下文,即使是在 Audited Regions 中,也不克不及假设它为 nonnull
  2. 对庞杂的指针范例(如 id * )必需显式去指定是 nonnull 仍是 nullable。比方,指定一个指向 nullable 工具的 nonnull 指针,可以运用 __nullable id * __nonnull ;
  3. 咱们经常运用的 NSError ** 通常是被假设为一个指向 nullable NSError 工具的 nullable 指针。

运用区分

共有三种用法:

  • nonnullnullable, null_unspecified
  • _Nonnull_Nullable_Null_unspecified
  • __nonnull__nullable__null_unspecified

这几种用法在申明时的位置区分:

  1. 单下划线和双下划线的需求放在范例界说之后。
  2. 无下划线的需求放在范例界说之前。

运用示例:

申明属性

@property (nonatomic, copy, nullable) NSString *name;
@property (nonatomic, copy) NSString *__nullable firstName;
@property (nonatomic, copy) NSString *_Nullable lastName;

润色方式前往值

- (nullable NSString *)method1;
- (NSString *__nullable)method2;
- (NSString *_Nullable)method3;

润色方式参数

- (void)methodWithString1:(nullable NSString *)aString;
- (void)methodWithString2:(NSString *__nullable)aString;
- (void)methodWithString3:(NSString *_Nullable)aString;

例外情形

⚠️双指针范例工具、Block 的前往值、Block 的传入参数等,不克不及用 nonnull/nullable 润色,只能用带下划线的 __nonnull/__nullable_Nonnull/_Nullable

- (void)methodwithError1:(NSError * _Nullable * __null_unspecified)error;
- (void)methodwithError2:(NSError * nullable * null_unspecified)error;

Block 前往值

- (void)methodWithBlock1:(nullable void(^)(void))block;
// ⚠️ 以上 nullable 润色的是方式传入参数,默示传入的 Block 可认为空,而不是润色 BlocK 前往值。

- (void)methodWithBlock2:(void (^ _Nullable)(void))block;
- (void)methodWithBlock3:(void (^ __nullable)(void))block;

Block 传入参数

- (void)methodWithBlock21:(nullable id nonnull(^)(id nullable parameters))block;
// ⚠️ 以上 nullable 润色的是方式传入参数,默示传入的 BlocK 可认为空。而 __nonnull 用于润色 Block 前往值 id 不克不及为空。

- (void)methodWithBlock22:(id  nonnull(^ nullable)(id _Nullable parameters))block;
- (void)methodWithBlock23:(id  _Nonnull (^ _Nonnull)(id _Nullable parameters))block;

宏 NS_ASSUME_NONNULL_BEGIN 与 NS_ASSUME_NONNULL_END

#import <Foundation/Foundation.h>

// 在这两个宏之间的代码,所有简略指针工具都被假设为 nonnull ,因此咱们只需求去指定那些 nullable 指针工具便可
。
NS_ASSUME_NONNULL_BEGIN

@interface MyObject : NSObject

// 默认为 nonnull
@property (nonatomic, copy) NSString *aString;

// 方式前往值默认为 nonnull
// 方式的参数显式申明为 nullabel,默示入参可认为空
- (id)methodWithString:(nullable NSString *)string;

@end

NS_ASSUME_NONNULL_END

参考

更多精彩,尽在https://bambi-eyes.com

没有评论

评论已关闭。