iOS 9 新特性關(guān)鍵字:nonnull志衣,nullable杨蛋,null_resettable
nonnull:表示不能為空
例:屬性值不能為空
@property(nonatomic, strong)NSString * _Nonnull name;
- 每個屬性都要寫關(guān)鍵字很麻煩秽誊,用以下方法:
NS_ASSUME_NONNULL_BEGIN
@interface TestObject : NSObject
- (NSString *)messageName:(NSString *)para;
- (BOOL)isEqualToObject:(TestObject *)testobject;
@property(nonatomic, strong) NSString *dynamicString;
@property(nonatomic, strong) ViewController *vc;
NS_ASSUME_NONNULL_END
在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間,定義的所有對象屬性和方法
默認(rèn)都是nonnull
- 系統(tǒng)的提示
id obj = [TestObject new];
[obj isEqualToObject:<#(nonnull TestObject *)#>];
我們應(yīng)該在自己的工程添加關(guān)鍵字,明確的告訴其他人接口傳入的參數(shù)是否可以為空
nullable:表示可以為空
例如系統(tǒng)中使用null_resettable:setter可空档押,getter不可空
系統(tǒng)中使用- 當(dāng)看到由 null_resettable 修飾的屬性時,應(yīng)該可以猜想到屬性的初始化方式是懶加載
@property (nonatomic, strong, null_resettable) UITableView *tableView;
如果項(xiàng)目中有關(guān)于 nonull 和 nullable 的相關(guān)警告祈纯,是因?yàn)槟闶褂昧似渲械囊粋€關(guān)鍵字令宿,那么編譯器就需要你指定其他指針的 null 類型。原則就是要不你就一個不用腕窥,要不你就所有都用
泛型
1.帶泛型的數(shù)組
1.添加非聲明對象會有警告
2.取出來的元素不再是 id 類型粒没,而是聲明的類型
3.會改變一些方法,使與聲明的類型相同
- 在初始化的時候可以添加不同的類型對象簇爆,之后就不可以了
NSMutableArray<TestObject *> *array = [NSMutableArray array];
id a = array[0].dynamicString;
[array addObject:<#(nonnull TestObject *)#>]
[array addObject:@[]]; !Incompatible pointer types sending 'NSArray *' to parameter of type 'TestObject * _Nonnull'
2.帶泛型的字典
1.可以規(guī)定 key 和 value 的類型
2.取出來的 value 的類型是確定的
NSMutableDictionary<NSString *, NSString*> * dic = [NSMutableDictionary dictionary];
NSInteger length = [dic objectForKey:@"name"].length;//可以直接在 value 上調(diào)用 length 方法
[dic setObject:@[] forKey:@"name"]; Incompatible pointer types sending 'NSArray *' to parameter of type 'NSString * _Nonnull'
3.自定義泛型
- 在類名后面添加 <>,中間寫自定義泛型的名稱來聲明泛型癞松。聲明好之后就能以參數(shù)類型的形式出現(xiàn)了
協(xié)變性和逆變性
__covariant:協(xié)變性爽撒,子類可以強(qiáng)轉(zhuǎn)到父類
__contravariant:逆變性,父類型可以強(qiáng)轉(zhuǎn)到子類型
__kindof
- 一般用在返回值响蓉,表示返回本類型及子類型都可以硕勿。
比如在繼承體系中,基類的方法的返回值是基類類型枫甲,在被繼承之后該方法就可以返回子類類型源武。