蘋果在 Xcode 6.3 引入了一個 Objective-C 的新特性:Nullability Annotations萌衬,這一新特性的核心是兩個新的類型修飾:__nullable
和 __nonnull
燕耿。從字面上我們可知猪腕, __nullable
表示對象可以是 NULL 或 nil,而 __nonnull
表示對象不應該為空贩据。當我們不遵循這一規(guī)則時栋操,編譯器就會給出警告。在 Xcode 7 中饱亮,為了避免與第三方庫潛在的沖突,蘋果把 __nonnull/__nullable
改成 _Nonnull/_Nullable
舍沙。再加上蘋果同樣支持了沒有下劃線的寫法 nonnull/nullable
近上,于是就造成現在有三種寫法這樣混亂的局面。
但是這三種寫法本質上都是互通的拂铡,只是放的位置不同壹无,舉例如下:
- 方法返回值修飾
- (nullable NSString *)method;
- (NSString * __nullable)method;
- (NSString * _Nullable)method;
- 聲明屬性的修飾
@property (nullable, nonatomic, copy) NSString *aString;
@property (nonatomic, copy) NSString * __nullable aString;
@property (nonatomic, copy) NSString * _Nullable aString;
- 方法參數修飾
- (void)methodWithString:(nullable NSString *)aString;
- (void)methodWithString:(NSString * _Nullable)aString;
- (void)methodWithString:(NSString * __nullable)aString;
- 而對于
雙指針類型對象
、Block 的返回值
感帅、Block 的參數
等斗锭,這時候就不能用nonnull/nullable
修飾,只能用帶下劃線的__nonnull/__nullable
或者_Nonnull/_Nullable
:
- (void)methodWithError:(NSError * _Nullable * _Nullable)error;
- (void)methodWithError:(NSError * __nullable * __null_unspecified)error;
/** nullable修飾Block可為空 */
- (void)methodWithBlock:(nullable void(^)(void))block;
- (void)methodWithBlock:(void(^ _Nullable)(void))block;
- (void)methodWithBlock:(void(^ __nullable)(void))block;
- (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;
總結
總結如下使用規(guī)范:
- 對于屬性失球、方法返回值岖是、方法參數的修飾,使用:
nonnull/nullable
实苞; - 對于 C 函數的參數豺撑、Block 的參數、Block 返回值的修飾黔牵,使用:
_Nonnull/_Nullable
聪轿, 建議棄用__nonnull/__nullable
。