#ios
NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 是 Objective-C 中用于标记代码段的一对宏,它们与 Clang 编译器的非空属性相关。这些宏主要用于提高代码的安全性和可读性,特别是在处理指针和对象时。
默认非空假设:
NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 之间的代码段中,所有指针类型(包括对象指针)默认被视为非空(nonnull)。这意味着,除非明确标记为可空(nullable),否则编译器会假设这些指针在使用时总是指向有效的内存。提高代码安全性:
简化代码:
#import <Foundation/Foundation.h>
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 关键字来明确标记它:
- (void)doSomethingWithOptionalString:(nullable NSString *)str;
这样,编译器就知道在调用此方法时,str 参数可能是空的,并且不会在传递空指针时发出警告或错误。
NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 宏为 Objective-C 代码提供了一种简洁且强大的方式来处理非空和可空指针的声明。通过默认非空假设,它们帮助开发者编写更安全、更健壮的代码,并减少了在代码中显式标记非空和可空指针的需要。