1.協(xié)議是不允許定義屬性和實(shí)例變量的.
2.分類在技術(shù)上可以定義屬性的,通過(guò)associatedObjects來(lái)實(shí)現(xiàn)setter和getter方法就可以將屬性合成.但是在默認(rèn)情況下避免在分類中定義屬性.
3.在AF中使用了和多關(guān)聯(lián)對(duì)象,例如
在看到這個(gè)文件的頭文件時(shí),我看到了這樣的一個(gè)宏定義,看著有點(diǎn)好奇,就去查了查,卻發(fā)現(xiàn)了一個(gè)很大的知識(shí),
即在Xcode6.3版本以后蘋(píng)果加入了一個(gè)新的特性nullability annotations革答。
可能大家看到這可能會(huì)有一絲明白,就是我們?cè)诓殚喒俜轿臋n或者是自己寫(xiě)的代碼報(bào)錯(cuò)類似于這個(gè)警告時(shí):
Pointer is missing a nullability type specifier (__nonnull or __nullable)
在看看系統(tǒng)的方法和屬性申明:
我們?cè)疽郧笆褂眯揎棇傩缘膶傩远际窃有?可讀寫(xiě)性,內(nèi)存相關(guān)的等關(guān)鍵字,但是從來(lái)沒(méi)有使用過(guò)nullable.
用這個(gè)nullable來(lái)修是到底是什么意思啦,很簡(jiǎn)單就是這個(gè)屬性可以為nil,修飾方法返回值和參數(shù)也是一樣可以為nil
還有一個(gè)關(guān)鍵字是nonnull,意思就很明確了就是不能為nil.
舉幾個(gè)例子吧
這些都是可以為nil的.
現(xiàn)在再來(lái)看不可以為nil的,并且后面會(huì)給大家看一個(gè)很屌的東西.
再看看我們?nèi)绻祷豱il會(huì)出現(xiàn)什么樣的結(jié)果,
其余的就不寫(xiě)了,那么說(shuō)好的屌爆了的東西在哪,好看代碼:
如果需要每個(gè)屬性或每個(gè)方法都去指定nonnull和nullable扒磁,是一件非常繁瑣的事。蘋(píng)果為了減輕我們的工作量痊硕,專門提供了兩個(gè)宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END拌喉。在這兩個(gè)宏之間的代碼速那,所有簡(jiǎn)單指針對(duì)象都被假定為nonnull,因此我們只需要去指定那些nullable的指針.
雖然有點(diǎn)跑偏了,但是可以學(xué)到一些新東西也是值得的.
好了回到正題,剛才看到af中使用了關(guān)聯(lián)對(duì)象.af的作者對(duì)使用關(guān)聯(lián)對(duì)象的案列做出了羅列.有以下幾種:
優(yōu)秀案例:
1.添加私有屬性,更好的去實(shí)現(xiàn)細(xì)節(jié).
2.添加對(duì)外開(kāi)放的屬性來(lái)增強(qiáng)分類的功能.
3.創(chuàng)建一個(gè)關(guān)于KVO的關(guān)聯(lián)觀察者.
反例:
1.當(dāng)值不需要時(shí)創(chuàng)建一個(gè)關(guān)聯(lián)對(duì)象.
2.濫用關(guān)聯(lián)對(duì)象
3.當(dāng)一個(gè)值可以被推算出時(shí),卻是用關(guān)聯(lián)對(duì)象.
如果喜歡小編,可以點(diǎn)擊關(guān)注,我會(huì)不定期的更新一些文章,也可以關(guān)注我的專題
本人聯(lián)系方式:qq:513961360
email:513961360@qq.com
也可以加我們的qq群希望能與朋友們一起聊天和學(xué)習(xí).群里還有很多iOS開(kāi)發(fā)者,幫助我們解決問(wèn)題,并且同時(shí)學(xué)習(xí).
qq群號(hào):580284575