天天看點

Xcode10 NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END

前言

更新成 Xcode 10 之後每次 New File 看到 .h 基本都能看到 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 成對出現在 @interface 與 @end 上下, 包裹住它, 這兩對關鍵字并非新特性, 隻是 Xcode 10 之後系統預設實作了, 應該是考慮到與 Swift 混編, 為了更好相容其 optional 與 non-optional。

原理

我們直接來看定義: NSObjectRuntime.h

#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")
           

其表示由 NS_ASSUME_NONNULL_BEGIN 開始以下定義的 對象都是 __nonnull 不可為空的, 直到 NS_ASSUME_NONNULL_END 作用域。

例如:

NS_ASSUME_NONNULL_BEGIN

@interface YZHAddBookDetailsVC : YZHBaseViewController

@property (nonatomic, copy) NSString* name;
@property (nonatomic, strong) NSArray* array;

@end

NS_ASSUME_NONNULL_END

           

其表示 name 和 array 都是由 __nonnull 修飾, 不可為空, 當編譯時如果為空會受到警告。

與其 對應的是 __nullable, 表示對象也可以為 nil。

希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。謝謝!!!!!
學習的路上,與君共勉!!!