貓貓學(xué)iOS之iOS9新常見(jiàn)關(guān)鍵字

貓貓分享,必須精品

原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:翟乃玉的博客
地址:http://www.itdecent.cn/notebooks/4236923/latest

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)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容