貓貓分享,必須精品
原創文章,歡迎轉載。轉載請注明:翟乃玉的博客
地址:http://www.lxweimin.com/notebooks/4236923/latest
iOS9新的關鍵字
貓貓主要對nullable、nonnull、null_resettable、_Null_unspecified等幾個關鍵詞做簡單介紹。
哪些地方用到
用于修飾屬性、方法參數、方法返回值
nullable
意義
表示可以為空,其根本目的是為了與swift中的optional(可選擇的)相互照應,也就是剛剛用swift時候經常有對象后面要你表明"?"那個東西。說的長遠一點,其實這應該算是一種規范,當然,這在swift中可以看做是規則,因為不用他xcode回給你報錯,你就沒法運行代碼,但是在oc當中,這目前來說是一種規范,主要為了讓程序猿間減少無用的交流,比如:
UIButton被創建后,我們不一定需要他的圖片,(沒有圖片的按鈕不常見嘛?)所以,當我用到蘋果給的UIButton類的時候,我只要看到這里有nullable這貨,我就知道,我可以沒有他,但是假如這里沒有這個詞,我就不知道或者說不確定這里是不是必須要有imageVIew,我是不是當前創造的Button必須是有圖有標題的還是說可以無圖無真相的。
使用
1.修飾property變量
1:
@property (nonatomic,strong,nullable)NSString *str;
2:
@property (nonatomic,strong)NSString *_Nullable str;
3:
@property (nonatomic,strong)NSString *__nullable str;
nullable可以用魚property變量,其實歸根到底,這個屬性還是用到了方法的傳參和返回值上面,修飾property其本質就是重寫get和set方法。
2.修飾方法參數
我們用上面的str來調用set方法,明顯看到他要求傳_Nullable(可以為空)的參數。
3.修飾方法返回值
我用點語法調用get方法,得到的返回值可以看到提示很明顯_Nullable(可以為空)
不過別誤會,不僅僅get,set方法可以用這些關鍵字,特地補充下:
修飾方法參數和方法返回值
1:
-(nullable NSString *)funcDo:(nullable NSString *)str
2:
-(NSString * _Nullable)funcDo:(NSString * _Nullable)str;
3:
-(NSString * __nullable)funcDo:(NSString * __nullable)str;
上面是nullable的三中寫法把基本,至于寫起來看個人習慣了,貓很懶,像兩個下劃線要多按好幾個鍵呢,所以,還是早點轉swift吧,一個?可以解決的事情為何要如此如此。。。。
non null
意義:表示不能為空
使用:與nullable基本一樣,不再過多敘述。
補充
網上搜索資料時候看到,iOS9有個新的宏(鬼知道)
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
他們意思是在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間定義的所有的屬性和方法默認都是nonnull(不能為空的)類型的,貓簡單看了下,的確是這樣的,好偷懶(牛逼)的說唉。。。
null_resettable 和 _Null_unspecified
null_resettable
字面理解:可以重新賦值為空
意義
生成的get方法返回不能為空,set方法參數可以為空。
這個地方有點繞,簡單說就是有的時候我們調用set方法的時候會給設置為nil,比如viewController的view
self.view = nil;
NSLog(self.view);
如上代碼我們打印出來的self.view并不會為nil,這是因為
其實這里通過打log我們可以簡單的重寫下系統底層view的實現:
- (UIView *)view{
if(!_view){
[self loadView];
[self viewDidLoad];
}
return _view;
}
//所以不管怎樣 view都不會為nill
注意
如果使用null_resettable必須重寫get方法,判斷屬性是否為空進行操作,保證get返回值不能為空。
_Null_unspecified
意義:
不確定是否為空,比如在調用self點語法時候,不確定是get方法還是set方法,所以不確定是否為空。
使用:
只有_Null_unspecified 和 __null_unspecified
是的你沒有看錯,他們倆不像nullable那樣可以多選,就這一種寫法。
__kindof
意義:
__kindof表示當前類或者子類。
格式:
放在類型前面,修飾此類型。
其實這東西還是為了程序猿的規范寫的,為了效率而戰,平時修飾當前類我們會用id(萬能的)和instancetype。
但是id存在以下倆缺點:
1、不能在編譯的時候檢測真實類型。
2、方法返回沒有提示,影響編程效率。
instancetype可以解決問題1,但是不能解決問題2
但是:__kindof 可以完美的解決用ID的壞處兩個問題。