? ? ? ? 在OC中桩盲,擴(kuò)展一個(gè)類(lèi)的方式有兩種:繼承與分類(lèi)。
? ? ? ? 繼承與分類(lèi)最大的區(qū)別是席吴,一般情況下赌结,分類(lèi)不能擴(kuò)展屬性,繼承可以擴(kuò)展屬性抢腐。但有一種情況下姑曙,分類(lèi)可以擴(kuò)展屬性,那就是在本類(lèi)中寫(xiě)的分類(lèi)迈倍。
? ? ? ? ?這里解釋下伤靠,屬性與成員變量的關(guān)系。
? ? ? ? 屬性: 聲明一個(gè)屬性啼染,則系統(tǒng)會(huì)默認(rèn)給生成讀取函數(shù)(set宴合,get),可以通過(guò)點(diǎn)運(yùn)算符來(lái)默認(rèn)調(diào)用這個(gè)存取方法,并且會(huì)產(chǎn)生一個(gè)以_開(kāi)頭的成員變量迹鹅。
? ? ? ? ?屬性就是與屬性相對(duì)應(yīng)的成員變量的值卦洽。在使用屬性的時(shí)候,其實(shí)本質(zhì)也是對(duì)成員變量的值進(jìn)行操作斜棚。
? ? ? ? ?成員變量:則是單純的一個(gè)變量阀蒂,不會(huì)有連帶的存取方法该窗。
? ? ? ? ?屬性是暴露在外面的,可以供外面進(jìn)行訪問(wèn)調(diào)用的蚤霞。而成員變量默認(rèn)是protected的酗失,保護(hù)的成員,如果被設(shè)置為public才允許外部對(duì)象調(diào)用昧绣,否則规肴,是訪問(wèn)不到的。
? ? ? ? 現(xiàn)在回到繼承與分類(lèi)的話題上來(lái)夜畴。拖刃。。
1.繼承Inherit
? ? ? ? 繼承是任何一個(gè)面向?qū)ο蟮恼Z(yǔ)言都有的特性贪绘。子類(lèi)可以繼承父類(lèi)的屬性與方法兑牡。
? ? ? ?有兩種情況下,必須需要使用繼承兔簇,而不能使用分類(lèi)的发绢。
? ? ? ? a. 當(dāng)需要擴(kuò)展的方法與原方法同名時(shí),并且需要調(diào)用父類(lèi)的同名方法垄琐,則需要繼承边酒。若此時(shí)使用分類(lèi),則分類(lèi)的方法的實(shí)現(xiàn)會(huì)覆蓋原方法的實(shí)現(xiàn)狸窘,不會(huì)訪問(wèn)到原方法墩朦。
? ? ? ? b. 當(dāng)需要擴(kuò)展屬性時(shí)。
2. 類(lèi)別:
? ? ? ? 這是OC特有的屬性翻擒,可以在不改變類(lèi)名和原類(lèi)的實(shí)現(xiàn)的前提下氓涣,進(jìn)行類(lèi)的擴(kuò)展。
? ? ? ?以下幾種情況,最好使用分類(lèi):
? ? ?a. 針對(duì)系統(tǒng)的一些類(lèi)進(jìn)行擴(kuò)展。例如村刨,NSString, NSArray, NSNumber等類(lèi),系統(tǒng)本身不提倡使用繼承去擴(kuò)展方法痒玩,因?yàn)檫@些類(lèi)內(nèi)部實(shí)現(xiàn)對(duì)繼承有所限制,所以最好用分類(lèi)的方式擴(kuò)展议慰。
? ? ? ? b.類(lèi)別支持開(kāi)發(fā)人員針對(duì)自己構(gòu)建的類(lèi)蠢古,把相關(guān)的方法分組到多個(gè)單獨(dú)的文件中,針對(duì)大型而復(fù)雜的類(lèi)别凹,可以提高維護(hù)性和可讀性草讶,并簡(jiǎn)化單個(gè)源文件的管理。
? ? ?ps: 類(lèi)別形式的擴(kuò)展還分為Category 和 Extension.在Xcode中創(chuàng)建文件時(shí)炉菲,這兩種文件被區(qū)分開(kāi)來(lái)了堕战。
? ? ? ? ? ?Category與Extension的區(qū)別:
? ? ? ? ? 1. Extension 是匿名的Category坤溃。
? ? ? ? 2. Extension 定義的方法,須在類(lèi)的implement 中實(shí)現(xiàn)践啄,而category不強(qiáng)求浇雹。
? ? ? ? 3. Extension可以定義屬性,而Category不能定義屬性屿讽。