首先先認識兩個特性:
__nullable 和 __nonnull,從字面上看, __nullable表示對象可以是 NULL 或 nil,而 __nonnull 表示對象不能為空,當(dāng)我們不遵守這一規(guī)則時,編譯器就會警告(??)
事實上,在任何可以使用 const 關(guān)鍵字的地方都可以使用 __nullable 和 __nonnull,不過這兩個關(guān)鍵字僅限于使用在指針類型上,
其實是為了配合 swift 使用出現(xiàn)的,因為 swift有可選類型,在Swift與Objective-C混編時,Swift編譯器并不知道一個Objective-C對象到底是optional還是non-optional骚勘,因此這種情況下編譯器會隱式地將Objective-C的對象當(dāng)成是non-optional。
例如:
@property (nonatomic,strong) NSArray *__nonnull items;
現(xiàn)在回來我們要學(xué)習(xí)的 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END,
如果每個地方都需要使用 nonnull 和 nonalbel,那么寫起來會很繁瑣,蘋果為了減輕我們的工作,專門定義了兩個宏NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END,會默認實現(xiàn) ,
不過占婉,為了安全起見恒界,蘋果還制定了幾條規(guī)則:
1,typedef定義的類型的nullability特性通常依賴于上下文捆蜀,即使是在Audited Regions中坎炼,也不能假定它為nonnull。
2,復(fù)雜的指針類型(如id *)必須顯示去指定是nonnull還是nullable吏颖。例如病往,指定一個指向nullable對象的nonnull指針,可以使用”__nullable id * __nonnull”冤议。
3,我們經(jīng)常使用的NSError **通常是被假定為一個指向nullable NSError對象的nullable指針斟薇。