iOS9的幾個新關鍵字(nonnull、nullable、null_resettable、__null_unspecified)

一、nonnull

  • 字面意思就能知道:不能爲空(用來修飾屬性,或者方法的參數,方法的返回值)
//三種使用方式均可以
@property (nonatomic, copy, nonnull) NSString *name;

@property (nonatomic, copy) NSString * _Nonnull name;

@property (nonatomic, copy) NSString * __nonnull name;

// 補充(不適用於assign屬性,由於它是專門用來修飾指針的)
@property (nonatomic, assign) NSUInteger age;
  • 補充(用下面宏包裹起來的屬性所有都具nonnull特徵,固然,若是其中某個屬性你不但願有這個特徵,也能夠本身定義,好比加個nullable)
  • 在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間,定義的全部對象屬性和方法默認都是nonnull程序員

  • 1.1 也能夠在定義方法的時候使用

// 返回值和參數都不能爲空
- (nonnull NSString *)test:(nonnull NSString *)name;
// 同上
- (NSString * _Nonnull)test1:(NSString * _Nonnull)name;
  • 這樣,你在使用以上方法的時候會出現這種效果提示
  • 一樣,使用屬性的時候:

二、nullable

  • 表示能夠爲空(使用方法和上面幾乎同樣,可是沒有發現和上面相似的宏)
// 三種使用方式
// 方式一:
@property (nonatomic, copy, nullable) NSString *name;
// 方式二:
@property (nonatomic, copy) NSString *_Nullable name;
// 方式三:
@property (nonatomic, copy) NSString *__nullable name;
  • 這樣,當在使用這個屬性的時候,Xcode的代碼提示會告訴你這個屬性是能夠爲空的,算是一種編程規範吧,減小程序員之間的交流。

三、null_resettable

  • get:不能返回空, set能夠爲空(注意:若是使用null_resettable,必須 重寫get方法或者set方法,處理傳遞的值爲空的狀況)
// 書寫方式:
@property (nonatomic, copy, null_resettable) NSString *name;
  • 設置一下set或get方法
- (void)setName:(NSString *)name {
    if (name == nil) {
        name = @"我叫暢敏";
    }
    _name = name;
}

- (NSString *)name {
    if (_name == nil) {
    _name = @"我叫暢敏";
    }
    return _name;
}

四、_Null_unspecified

  • 不肯定是否爲空
  • 使用方式只有這兩種:
@property (nonatomic, strong) NSString *_Null_unspecified name;

@property (nonatomic, strong) NSString *__null_unspecified name;
相關文章
相關標籤/搜索