貓貓學iOS之iOS9新常見關鍵字

貓貓分享,必須精品

原創文章,歡迎轉載。轉載請注明:翟乃玉的博客
地址: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的壞處兩個問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容