_Nullable等用法
__nullable 和__nonnull她渴。從字面上我們可知, __nullable 表示對(duì)象可以是 NULL 或 nil,而 __nonnull 表示對(duì)象不應(yīng)該為空。當(dāng)我們不遵循這一規(guī)則時(shí)夕吻,編譯器就會(huì)給出警告。在 Xcode 7 中繁仁,為了避免與第三方庫(kù)潛在的沖突涉馅,蘋果把 __nonnull/__nullable改成 _Nonnull/_Nullable。再加上蘋果同樣支持了沒(méi)有下劃線的寫法 nonnull/nullable 改备,于是就造成現(xiàn)在有三種寫法這樣混亂的局面控漠。
但是這三種寫法本質(zhì)上都是互通的,只是放的位置不同悬钳,舉例如下:
方法返回值修飾:
- (nullable NSString*)method ;
- (NSString* __nullable)method2 ;
- (NSString* _Nullable)method3 ;
聲明屬性的修飾:
@property(nonatomic, copy, nullable) NSString *aString;
@property(nonatomic, copy) NSString* __nullable aString;
@property(nonatomic, copy) NSString* _Nullable aString;
方法參數(shù)修飾:
- (void)methodWithString:(nullable NSString *)aString;
- (void)methodWithString:(NSString *_Nullable)aString;
- (void)methodWithString:(NSString *__nullable)aString;
而對(duì)于雙指針類型對(duì)象 盐捷、 Block 的返回值 、 Block 的參數(shù) 等默勾,這時(shí)候就不能用 nonnull/nullable 修飾碉渡,只能用帶下劃線的 __nonnull / __nullable 或者 _Nonnull/_Nullable
- (void)methodWithError:(NSError *_Nullable *_Nullable)error;
- (void)methodWithError:(NSError * __nullable * __null_unspecified)error;
// 以及其他的組合方式
- (void)methodWithBlock:(nullable id __nonnull(^)(id __nullable params))block;
- (void)methodWithBlock:(id __nonnull(^ __nullable)(id __nullable params))block;
- (void)methodWithBlock:(id _Nonnull (^ _Nullable)(id _Nullable params))block;
歸納:
對(duì)于屬性、方法返回值母剥、方法參數(shù)的修飾滞诺,使用: nonnull/nullable ;
對(duì)于 C 函數(shù)的參數(shù)环疼、Block 的參數(shù)习霹、Block 返回值的修飾,使用: _Nonnull/_Nullable