新聞中心
iOS分類(category)、類擴展(extension)、繼承的區(qū)別
iOS在2.0就已經(jīng)推出分類(Category),它允許開發(fā)者在不改動原有類的情況下,對該類進行擴展使用。分類(Category)是OC中的特有語法,它是表示一個指向分類的結(jié)構(gòu)體的指針。原則上它只能增加方法,不能增加成員(實例)變量,具體原因看源碼:
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比思禮網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式思禮網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋思禮地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
從中我們可以看出,這個結(jié)構(gòu)體主要包含了分類定義的實例方法與類方法,其中 instance_methods 列表是 objc_class 中方法列表的一個子集,而 class_methods 列表是元類方法列表的一個子集。但這個結(jié)構(gòu)體里面根本沒有屬性列表。
對于繼承,應(yīng)該都是很熟悉了,網(wǎng)上詳細的資料也是非常多,在這里就不再贅述,主要介紹它與分類的區(qū)別。
iOS 實現(xiàn)多繼承的幾種方式
我們都知道OC是不支持多繼承的,這是因為消息機制名稱查找發(fā)生在運行時而非編譯時,很難解決多個基類可能導(dǎo)致的二義性問題,那么如果我們想要一個類a同時繼承類b和類c,我們要如何做才能達到我們想要的結(jié)果呢?我們創(chuàng)建三個類ClassA、ClassB、ClassC,A和B分別有兩個方法run和walk,假設(shè)我們需要讓C同時擁有run和walk方法,我們可以通過下面幾種方法來達到我們想要的效果。
Son添加兩個屬性father1(- (void)playFootBall),father2(- (void)playBasketball)。那么Son就有了father1和father2的能力。類似于繼承了他們兩個!?。?/p>
將C類需要繼承的方法以及屬性在A和B中各自聲明一份協(xié)議,C類遵守這兩份協(xié)議,同時在C類中實現(xiàn)協(xié)議中的方法以及屬性
類別也可以用來模擬多繼承,比如給當(dāng)前類添加方法,利用runTime來添加屬性,方法不表,別人文章 Category與Extension 有實現(xiàn),可以參考
NSProxy 并沒有繼承NSObject ,而是實現(xiàn)了NSObject協(xié)議
NSProxy 和 NSObject 類都實現(xiàn)了NSObject 協(xié)議 ,我們仔細看發(fā)現(xiàn)NSProxy并沒有init或new方法 ;這個就尷尬了,這個類是一個魏忠賢版的類。。。。。init方法貌似需要子類去實現(xiàn),也就是這個類注定要被別的類繼承。
實現(xiàn)與3、消息轉(zhuǎn)發(fā)(1、快速轉(zhuǎn)發(fā)和2、標(biāo)準(zhǔn)轉(zhuǎn)發(fā))一樣,只不過3、消息轉(zhuǎn)發(fā)是繼承NSObject ,而現(xiàn)在是使用NSProxy和NSObject有共同的協(xié)議,創(chuàng)建NSProxy的子類進行消息轉(zhuǎn)發(fā)
結(jié)論: 如此看來NSProxy確實更適合實現(xiàn)做為消息轉(zhuǎn)發(fā)的代理類, 因為作為一個抽象類, NSProxy自身能夠處理的方法極小(僅NSObject接口中定義的部分方法), 所以其它方法都能夠按照設(shè)計的預(yù)期被轉(zhuǎn)發(fā)到被代理的對象中.而NSObject很多方法自己有實現(xiàn),例如respondsToSelector:和isKindOfClass,這樣的話就不會走消息轉(zhuǎn)發(fā)流程。(消息轉(zhuǎn)發(fā)是只有當(dāng)接收者無法處理時才會通過forwardInvocation:來尋求能夠處理的對象.)
總結(jié):NSProxy比NSObject更干凈。
注意:NSProxy這個基類沒有定義默認(rèn)的init方法.
NSProxy類
iOS中分類和繼承的區(qū)別
? 在OC中,擴展一個類的方式有兩種:繼承與分類。
? 繼承與分類最大的區(qū)別是,一般情況下,分類不能擴展屬性,繼承可以擴展屬性。但有一種情況下,分類可以擴展屬性,那就是在本類中寫的分類。
? ? ?這里解釋下,屬性與成員變量的關(guān)系。
? ? 屬性: 聲明一個屬性,則系統(tǒng)會默認(rèn)給生成讀取函數(shù)(set,get),可以通過點運算符來默認(rèn)調(diào)用這個存取方法,并且會產(chǎn)生一個以_開頭的成員變量。
? ? ?屬性就是與屬性相對應(yīng)的成員變量的值。在使用屬性的時候,其實本質(zhì)也是對成員變量的值進行操作。
? ? ?成員變量:則是單純的一個變量,不會有連帶的存取方法。
? ? ?屬性是暴露在外面的,可以供外面進行訪問調(diào)用的。而成員變量默認(rèn)是protected的,保護的成員,如果被設(shè)置為public才允許外部對象調(diào)用,否則,是訪問不到的。
? ? 現(xiàn)在回到繼承與分類的話題上來。。。
1.繼承Inherit
? ? 繼承是任何一個面向?qū)ο蟮恼Z言都有的特性。子類可以繼承父類的屬性與方法。
? ?有兩種情況下,必須需要使用繼承,而不能使用分類的。
? ? a. 當(dāng)需要擴展的方法與原方法同名時,并且需要調(diào)用父類的同名方法,則需要繼承。若此時使用分類,則分類的方法的實現(xiàn)會覆蓋原方法的實現(xiàn),不會訪問到原方法。
? ? b. 當(dāng)需要擴展屬性時。
2. 類別:
? ? 這是OC特有的屬性,可以在不改變類名和原類的實現(xiàn)的前提下,進行類的擴展。
? ?以下幾種情況,最好使用分類:
?a. 針對系統(tǒng)的一些類進行擴展。例如,NSString, NSArray, NSNumber等類,系統(tǒng)本身不提倡使用繼承去擴展方法,因為這些類內(nèi)部實現(xiàn)對繼承有所限制,所以最好用分類的方式擴展。
? ? b.類別支持開發(fā)人員針對自己構(gòu)建的類,把相關(guān)的方法分組到多個單獨的文件中,針對大型而復(fù)雜的類,可以提高維護性和可讀性,并簡化單個源文件的管理。
ps: 類別形式的擴展還分為Category 和 Extension.在Xcode中創(chuàng)建文件時,這兩種文件被區(qū)分開來了。
? ? ? ?Category與Extension的區(qū)別:
? ? ? 1. Extension 是匿名的Category。
? ? 2. Extension 定義的方法,須在類的implement 中實現(xiàn),而category不強求。
? ? 3. Extension可以定義屬性,而Category不能定義屬性。
分享名稱:ios開發(fā)繼承,iOS開發(fā)吧
文章網(wǎng)址:http://fisionsoft.com.cn/article/dscpdhs.html