Nonnull區(qū)域設(shè)置(Audited Regions)
如果需要每個屬性或每個方法都去指定nonnull和nullable尝抖,是一件非常繁瑣的事。蘋果為了減輕我們的工作量,專門提供了兩個宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
NS_ASSUME_NONNULL_BEGIN
@interface TestNullabilityClass ()
@property (nonatomic, copy) NSArray * items;
- (id)itemWithName:(nullable NSString *)name;
@end
NS_ASSUME_NONNULL_END}
在上面的代碼中卷要,items屬性默認(rèn)是nonnull的,itemWithName:方法的返回值也是nonnull独榴,而參數(shù)是指定為nullable的僧叉。
不過,為了安全起見棺榔,蘋果還制定了幾條規(guī)則:
- typedef定義的類型的nullability特性通常依賴于上下文瓶堕,即使是在Audited Regions中,也不能假定它為nonnull症歇。
- 復(fù)雜的指針類型(如id *)必須顯示去指定是nonnull還是nullable捞烟。例如,指定一個指向nullable對象的nonnull指針当船,可以使用”__nullable id * __nonnull”。
- 我們經(jīng)常使用的NSError **通常是被假定為一個指向nullable NSError對象的nullable指針默辨。