//聯(lián)系人:石虎?QQ:1224614774?昵稱:嗡嘛呢叭咪哄
一、概念
兩個(gè)新的類型修飾:__nullable和__nonnull橡类。從字面上我們可知,__nullable表示對(duì)象可以是NULL?或?nil,而__nonnull表示對(duì)象不應(yīng)該為空奴艾。
當(dāng)我們不遵循這一規(guī)則時(shí),編譯器就會(huì)給出警告内斯。在 Xcode?7?中蕴潦,為了避免與第三方庫潛在的沖突像啼,蘋果把__nonnull/__nullable改成_Nonnull/_Nullable。再加上蘋果同樣支持了沒有下劃線的寫法nonnull/nullable潭苞,于是就造成現(xiàn)在有三種寫法這樣混亂的局面忽冻。
? 但是這三種寫法本質(zhì)上都是互通的,只是放的位置不同此疹,
二僧诚、聲明屬性
方法返回值修飾:
? - (nullableNSString*)method;
- (NSString*?__nullable)method;
- (NSString*?_Nullable)method;
聲明屬性的修飾:
@property(nonatomic,copy,nullable)NSString*aString;
? @property(nonatomic,copy)NSString* __nullableaString;
@property(nonatomic,copy)NSString*?_Nullable?aString;
方法參數(shù)修飾:
- (void)methodWithString:(nullableNSString*)aString;
- (void)methodWithString:(NSString*?_Nullable)aString;
- (void)methodWithString:(NSString*?__nullable)aString;
三、總結(jié)
而對(duì)于?雙指針類型對(duì)象?蝗碎、?Block 的返回值?湖笨、?Block 的參數(shù)?等,這時(shí)候就不能用nonnull/nullable修飾蹦骑,只能用帶下劃線的__nonnull/__nullable或者_(dá)Nonnull/_Nullable:
aString?屬性默認(rèn)是nonnull的慈省,methodWithString:方法的返回值也是nonnull,而方法的參數(shù)?str?被顯式指定為nullable眠菇。
蘋果還制定了以下幾條規(guī)則:
通過typedef定義的類型的?nullability?特性通常依賴于上下文边败,即使是在 Audited Regions 中,也不能假定它為nonnull琼锋;
對(duì)于復(fù)雜的指針類型(如id?*?)必須顯式去指定是nonnull還是nullable放闺。例如,指定一個(gè)指向nullable對(duì)象的nonnull指針缕坎,可以使用__nullable?id?*?__nonnull怖侦;
我們經(jīng)常使用的?NSError **?通常是被假定為一個(gè)指向nullableNSError 對(duì)象的nullable指針。