_Nullable等用法
__nullable 和__nonnull。從字面上我們可知, __nullable 表示對象可以是 NULL 或 nil,而 __nonnull 表示對象不應該為空。當我們不遵循這一規(guī)則時,編譯器就會給出警告。在 Xcode 7 中,為了避免與第三方庫潛在的沖突,蘋果把 __nonnull/__nullable改成 _Nonnull/_Nullable。再加上蘋果同樣支持了沒有下劃線的寫法 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;
而對于雙指針類型對象 、 Block 的返回值 、 Block 的參數(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;
歸納:
對于屬性、方法返回值、方法參數(shù)的修飾,使用: nonnull/nullable ;
對于 C 函數(shù)的參數(shù)、Block 的參數(shù)、Block 返回值的修飾,使用: _Nonnull/_Nullable