#ios `NS_ASSUME_NONNULL_BEGIN` 和 `NS_ASSUME_NONNULL_END` 是 Objective-C 中用于标记代码段的一对宏,它们与 Clang 编译器的非空属性相关。这些宏主要用于提高代码的安全性和可读性,特别是在处理指针和对象时。 ### 作用 1. ‌**默认非空假设**‌: - 在 `NS_ASSUME_NONNULL_BEGIN` 和 `NS_ASSUME_NONNULL_END` 之间的代码段中,所有指针类型(包括对象指针)默认被视为非空(`nonnull`)。这意味着,除非明确标记为可空(`nullable`),否则编译器会假设这些指针在使用时总是指向有效的内存。 2. ‌**提高代码安全性**‌: - 通过默认非空假设,编译器可以在编译时捕捉到更多的潜在空指针错误,从而提高代码的健壮性和安全性。 3. ‌**简化代码**‌: - 开发者不再需要在每个可能为空的指针声明处都显式地添加非空或可空标记,这简化了代码并提高了可读性。 ### 使用示例 ``` objc #import NS_ASSUME_NONNULL_BEGIN @interface MyClass : NSObject - (void)doSomethingWithString:(NSString *)str; // str 默认 nonnull @end NS_ASSUME_NONNULL_END @implementation MyClass - (void)doSomethingWithString:(NSString *)str { // 在这里,我们可以安全地使用 str,因为它被认为是非空的 NSLog(@"%@", str); } @end ``` 在上面的示例中,`doSomethingWithString:` 方法的参数 `str` 默认是非空的。如果在调用此方法时传递了一个空指针,编译器将在编译时发出警告或错误(取决于编译器的设置)。 ### 可空标记 如果某个指针在特定情况下可能为空,你可以使用 `nullable` 关键字来明确标记它: ``` objc - (void)doSomethingWithOptionalString:(nullable NSString *)str; ``` 这样,编译器就知道在调用此方法时,`str` 参数可能是空的,并且不会在传递空指针时发出警告或错误。 ### 总结 `NS_ASSUME_NONNULL_BEGIN` 和 `NS_ASSUME_NONNULL_END` 宏为 Objective-C 代码提供了一种简洁且强大的方式来处理非空和可空指针的声明。通过默认非空假设,它们帮助开发者编写更安全、更健壮的代码,并减少了在代码中显式标记非空和可空指针的需要。