-
nullable: 表示對象可以為空
下面是三種寫法:
@property (nullable, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nullable name;
@property (nonatomic, strong) NSString * __nullable name;
-
nonnull: 表示對象不能為空
下面是三種寫法:
@property (nonnull, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nonnull name;
@property (nonatomic, strong) NSString * __nonnull name;
null_resettable: 當(dāng)用此關(guān)鍵字修飾對象屬性時(shí), 表示通過getter方法獲取的對象屬性不為空,通過setter方法進(jìn)行賦值時(shí)可以為空, 而且必須實(shí)現(xiàn)其getter或者setter方法, 不然會報(bào)警告.泛型
可以通過泛型的特性來限制數(shù)組中的元素只能為某一種類型, 例如有一個(gè)數(shù)組,我們想讓放入里面的元素都為NSString類型, 那么可以這么寫:
@property (nonatomic, strong) NSMutableArray<NSString *> * names;
我們也可以自定義泛型:
下面我們新建一個(gè)Animal類, 并給Animal類添加一個(gè)表示物種的屬性species, 這個(gè)屬性的類型時(shí)是不確定的.
Animal.h中代碼如下:
#import <Foundation/Foundation.h>
@interface Animal<ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end
接著在ViewController.m進(jìn)行測試,在初始化時(shí)如果指定了ObjectType為某一類型后, 在對屬性species進(jìn)行賦值時(shí), xcode會進(jìn)行提示species所需的類型,如下圖:

自定義泛型
-
__covariant: 協(xié)變, 子類可以強(qiáng)轉(zhuǎn)為父類(里氏替換原則).
__contravariant: 逆變, 父類可以強(qiáng)轉(zhuǎn)為子類.
新建兩個(gè)Animal對象a和b,分別制定屬性的類型為NSString和NSMutableString類型,通過a和b進(jìn)行強(qiáng)轉(zhuǎn)時(shí)會出現(xiàn)如下警告:

強(qiáng)轉(zhuǎn)時(shí)報(bào)錯(cuò)
如果想要a = b不報(bào)警,也就是允許子類強(qiáng)轉(zhuǎn)為父類,則需要在Animal.h加入__covariant關(guān)鍵字, 代碼如下:
#import <Foundation/Foundation.h>
@interface Animal<__covariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end
如果想要b = a不報(bào)警,也就是允許父類強(qiáng)轉(zhuǎn)為子類,則需要在Animal.h加入__contravariant關(guān)鍵字, 代碼如下:
#import <Foundation/Foundation.h>
@interface Animal<__contravariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end
-
__kindof: 表示當(dāng)前類或者其子類.
例如在UITableView類中有如下方法:
- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
這里的__kindof表示的含義就是該方法返回的是UITableViewCell對象,或者是UITableViewCell的子類對象.