貓貓分享,必須精品
iOS9新的關(guān)鍵字
貓貓主要對(duì)nullable、nonnull、null_resettable、_Null_unspecified等幾個(gè)關(guān)鍵詞做簡(jiǎn)單介紹。
哪些地方用到
用于修飾屬性、方法參數(shù)、方法返回值
nullable
意義
表示可以為空,其根本目的是為了與swift中的optional(可選擇的)相互照應(yīng),也就是剛剛用swift時(shí)候經(jīng)常有對(duì)象后面要你表明"?"那個(gè)東西。說(shuō)的長(zhǎng)遠(yuǎn)一點(diǎn),其實(shí)這應(yīng)該算是一種規(guī)范,當(dāng)然,這在swift中可以看做是規(guī)則,因?yàn)椴挥盟鹸code回給你報(bào)錯(cuò),你就沒(méi)法運(yùn)行代碼,但是在oc當(dāng)中,這目前來(lái)說(shuō)是一種規(guī)范,主要為了讓程序猿間減少無(wú)用的交流,比如:

UIButton被創(chuàng)建后,我們不一定需要他的圖片,(沒(méi)有圖片的按鈕不常見(jiàn)嘛?)所以,當(dāng)我用到蘋(píng)果給的UIButton類(lèi)的時(shí)候,我只要看到這里有nullable這貨,我就知道,我可以沒(méi)有他,但是假如這里沒(méi)有這個(gè)詞,我就不知道或者說(shuō)不確定這里是不是必須要有imageVIew,我是不是當(dāng)前創(chuàng)造的Button必須是有圖有標(biāo)題的還是說(shuō)可以無(wú)圖無(wú)真相的。
使用
1.修飾property變量
1:
@property (nonatomic,strong,nullable)NSString *str;
2:
@property (nonatomic,strong)NSString *_Nullable str;
3:
@property (nonatomic,strong)NSString *__nullable str;
nullable可以用魚(yú)property變量,其實(shí)歸根到底,這個(gè)屬性還是用到了方法的傳參和返回值上面,修飾property其本質(zhì)就是重寫(xiě)get和set方法。
2.修飾方法參數(shù)
我們用上面的str來(lái)調(diào)用set方法,明顯看到他要求傳_Nullable(可以為空)的參數(shù)。

3.修飾方法返回值
我用點(diǎn)語(yǔ)法調(diào)用get方法,得到的返回值可以看到提示很明顯_Nullable(可以為空)

不過(guò)別誤會(huì),不僅僅get,set方法可以用這些關(guān)鍵字,特地補(bǔ)充下:
修飾方法參數(shù)和方法返回值
1:
-(nullable NSString *)funcDo:(nullable NSString *)str
2:
-(NSString * _Nullable)funcDo:(NSString * _Nullable)str;
3:
-(NSString * __nullable)funcDo:(NSString * __nullable)str;
上面是nullable的三中寫(xiě)法把基本,至于寫(xiě)起來(lái)看個(gè)人習(xí)慣了,貓很懶,像兩個(gè)下劃線(xiàn)要多按好幾個(gè)鍵呢,所以,還是早點(diǎn)轉(zhuǎn)swift吧,一個(gè)?可以解決的事情為何要如此如此。。。。
non null
意義:表示不能為空
使用:與nullable基本一樣,不再過(guò)多敘述。
補(bǔ)充
網(wǎng)上搜索資料時(shí)候看到,iOS9有個(gè)新的宏(鬼知道)
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
他們意思是在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間定義的所有的屬性和方法默認(rèn)都是nonnull(不能為空的)類(lèi)型的,貓簡(jiǎn)單看了下,的確是這樣的,好偷懶(牛逼)的說(shuō)唉。。。
null_resettable 和 _Null_unspecified
null_resettable
字面理解:可以重新賦值為空
意義
生成的get方法返回不能為空,set方法參數(shù)可以為空。
這個(gè)地方有點(diǎn)繞,簡(jiǎn)單說(shuō)就是有的時(shí)候我們調(diào)用set方法的時(shí)候會(huì)給設(shè)置為nil,比如viewController的view
self.view = nil;
NSLog(self.view);
如上代碼我們打印出來(lái)的self.view并不會(huì)為nil,這是因?yàn)?/p>

其實(shí)這里通過(guò)打log我們可以簡(jiǎn)單的重寫(xiě)下系統(tǒng)底層view的實(shí)現(xiàn):
- (UIView *)view{
if(!_view){
[self loadView];
[self viewDidLoad];
}
return _view;
}
//所以不管怎樣 view都不會(huì)為nill
注意
如果使用null_resettable必須重寫(xiě)get方法,判斷屬性是否為空進(jìn)行操作,保證get返回值不能為空。
_Null_unspecified
意義:
不確定是否為空,比如在調(diào)用self點(diǎn)語(yǔ)法時(shí)候,不確定是get方法還是set方法,所以不確定是否為空。

使用:
只有_Null_unspecified 和 __null_unspecified
是的你沒(méi)有看錯(cuò),他們倆不像nullable那樣可以多選,就這一種寫(xiě)法。
__kindof
意義:
__kindof表示當(dāng)前類(lèi)或者子類(lèi)。
格式:
放在類(lèi)型前面,修飾此類(lèi)型。
其實(shí)這東西還是為了程序猿的規(guī)范寫(xiě)的,為了效率而戰(zhàn),平時(shí)修飾當(dāng)前類(lèi)我們會(huì)用id(萬(wàn)能的)和instancetype。
但是id存在以下倆缺點(diǎn):
1、不能在編譯的時(shí)候檢測(cè)真實(shí)類(lèi)型。
2、方法返回沒(méi)有提示,影響編程效率。
instancetype可以解決問(wèn)題1,但是不能解決問(wèn)題2
但是:__kindof 可以完美的解決用ID的壞處兩個(gè)問(wèn)題。