注:在看第三方框架的時候,常用的一些封裝細節,因此對封裝細小知識點進行總結。
一、nonnull:字面意思就能知道:不能為空(用來修飾屬性,或者方法的參數,方法的返回值)
1.屬性變量里面添加方式
@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
2.方法函數里面添加方式
返回值和參數都不能為空
(nonnull NSString *)test:(nonnull NSString *)name;
(NSString * _Nonnull)test1:(NSString * _Nonnull)name;
這樣,你在使用以上方法的時候會出現這種效果提示
同樣,使用屬性的時候:
二、nullable:表示可以為空(使用方法和上面幾乎一樣,但是沒有發現和上面類似的宏)
1.增加屬性方式
@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 = @"我叫XX"; } _name = name; } -(NSString *)name { if (_name == nil) { _name = @"我叫XX"; } return _name; }
四、_Null_unspecified:不確定是否為空
使用方式只有這兩種:
@property (nonatomic, strong) NSString *_Null_unspecified name;
@property (nonatomic, strong) NSString *__null_unspecified name;
總結:主要就是為了提高開發規范,提示使用的人應該傳什么樣的值,如果違反了對規范值的要求,就會有警告;
引用文檔:
IOS9的幾個新關鍵字(nonnull、nullable、null_resettable、__null_unspecified)