1.新出的關鍵字:non null , nullable,null_resettable,_Null_unspecified
1.1 nullable 即可以為nil
定義屬性:
方式一:
@property (nonatomic, strong, nullable) NSString *name;
方式二:
@property (nonatomic, strong) NSString * _Nullable name;
方式三:
@property (nonatomic, strong) NSString * __nullable name;
1.2 nonnull:表示屬性不能為空,
定義屬性
方式一:
@property (nonatomic, strong, nonnull) NSString *name;
方式二:
@property (nonatomic, strong) NSString * _Nonnull name;
方式三:
@property (nonatomic, strong) NSString * __nonnull name;
在NS_ASSUME_NONNULL_BEGIN與NS_ASSUME_NONNULL_END之間所有的對象屬性,方法參數,方法返回值,默認都是nonnull。
NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, strong) NSString *name;
NS_ASSUME_NONNULL_END
1.3 null_resettable:可以重新設置空,set方法可以為空,get不能為空。
方式一:
@property (nonatomic, strong, null_resettable) NSString *name;
注意:用null_resettable屬性,必須重寫set,或者get方法,處理傳值為nil的情況,可以模仿控制器view的get方法,當view為nil,就自己創建一個.
1.4 _Null_unspecified:不確定是否為空.
方式一:
@property (nonatomic, strong) NSString * _Null_unspecified name;
2.泛型:限制類型
2.1 好處:
* 提高程序員開發規范,減少交流成本。
* 從數組或者字典取值,都是id類型,不能調用點語法,但是使用泛型,就可以了。
2.2 開發中使用場景:
* 限制集合中的類型,注意:只能檢測方法的調用,因為聲明的泛型,只能放在方法中
* 當一個類在聲明的時候,某個對象的屬性不確定,只有創建對象的時候才確定,可以使用泛型
2.3 例如:
聲明泛型,在創建對象的時候,確定泛型,在賦值就有提示了。
2.3.1
泛型中協變,逆變,用于轉換類型
默認帶有泛型的變量,互相賦值有報警告,使用協變,逆變,就能解決.
協變(__covariant): 向上轉型, 子類轉父類
逆變(__contravariant):向下轉型 父類轉子類
2.4 __kindof:相當于,表示某個類或者他的子類。
用途:設計模型中可以使用,當給某個類提供類方法,想讓外界調用能看到創建什么對象,并且不報警告。
例如:
+ (__kindof Person *)person;