OC 中 nullable、__nullable、_Nullable 的区别

时间:2024-01-25 08:34:39

在 Objective-C 中,nullable__nullable_Nullable 都是用来表示一个对象可以是 nil 的注解。它们在不同的上下文中使用,但本质上具有相同的意义。这些注解主要用于与 Swift 互操作时提供更清晰的 API,并帮助开发者更好地处理 nil 值。以下是它们各自的使用情况和区别:

nullable

nullable 是在 Xcode 7 和更高版本中引入的,用于属性、方法参数和返回类型的注解,表明该值可以为 nil。这个注解是在头文件中使用,通常在属性、方法参数和返回类型的前面。例如:

@property (nonatomic, nullable) NSString *optionalString;

- (nullable NSString *)methodThatReturnsNullableString;
- (void)methodThatTakesNullableString:(nullable NSString *)string;

__nullable

__nullablenullable 的低级别等价物,它在 nullable 出现之前就存在了。虽然 nullable 更推荐用于头文件和公共 API,但 __nullable 仍然可以在实现文件中使用。例如:

- (void)methodWithNullableParam:(NSString * __nullable)param;

_Nullable

_Nullable 是在属性、方法参数和返回类型中用于指针类型的注解。通常,这是在声明 C 函数或者 C 类型的指针时使用。例如:

void functionWithNullableParam(NSString * _Nullable param);

总结

虽然 nullable__nullable_Nullable 在不同的情况下使用,但它们都传达了同样的信息:相关的对象或值可以为 nil。在现代 Objective-C 开发中,推荐使用 nullable,因为它提供了更清晰和一致的语法。然而,了解这些注解的等价物也有助于在阅读或维护老旧代码时更好地理解它们的含义。