真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

ios開發(fā)繼承,iOS開發(fā)吧

iOS分類(category)、類擴展(extension)、繼承的區(qū)別

iOS在2.0就已經推出分類(Category),它允許開發(fā)者在不改動原有類的情況下,對該類進行擴展使用。分類(Category)是OC中的特有語法,它是表示一個指向分類的結構體的指針。原則上它只能增加方法,不能增加成員(實例)變量,具體原因看源碼:

成都創(chuàng)新互聯公司-專業(yè)網站定制、快速模板網站建設、高性價比思禮網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式思禮網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋思禮地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

從中我們可以看出,這個結構體主要包含了分類定義的實例方法與類方法,其中 instance_methods 列表是 objc_class 中方法列表的一個子集,而 class_methods 列表是元類方法列表的一個子集。但這個結構體里面根本沒有屬性列表。

對于繼承,應該都是很熟悉了,網上詳細的資料也是非常多,在這里就不再贅述,主要介紹它與分類的區(qū)別。

iOS 實現多繼承的幾種方式

我們都知道OC是不支持多繼承的,這是因為消息機制名稱查找發(fā)生在運行時而非編譯時,很難解決多個基類可能導致的二義性問題,那么如果我們想要一個類a同時繼承類b和類c,我們要如何做才能達到我們想要的結果呢?我們創(chuàng)建三個類ClassA、ClassB、ClassC,A和B分別有兩個方法run和walk,假設我們需要讓C同時擁有run和walk方法,我們可以通過下面幾種方法來達到我們想要的效果。

Son添加兩個屬性father1(- (void)playFootBall),father2(- (void)playBasketball)。那么Son就有了father1和father2的能力。類似于繼承了他們兩個?。?!

將C類需要繼承的方法以及屬性在A和B中各自聲明一份協議,C類遵守這兩份協議,同時在C類中實現協議中的方法以及屬性

類別也可以用來模擬多繼承,比如給當前類添加方法,利用runTime來添加屬性,方法不表,別人文章 Category與Extension 有實現,可以參考

NSProxy 并沒有繼承NSObject ,而是實現了NSObject協議

NSProxy 和 NSObject 類都實現了NSObject 協議 ,我們仔細看發(fā)現NSProxy并沒有init或new方法 ;這個就尷尬了,這個類是一個魏忠賢版的類。。。。。init方法貌似需要子類去實現,也就是這個類注定要被別的類繼承。

實現與3、消息轉發(fā)(1、快速轉發(fā)和2、標準轉發(fā))一樣,只不過3、消息轉發(fā)是繼承NSObject ,而現在是使用NSProxy和NSObject有共同的協議,創(chuàng)建NSProxy的子類進行消息轉發(fā)

結論: 如此看來NSProxy確實更適合實現做為消息轉發(fā)的代理類, 因為作為一個抽象類, NSProxy自身能夠處理的方法極小(僅NSObject接口中定義的部分方法), 所以其它方法都能夠按照設計的預期被轉發(fā)到被代理的對象中.而NSObject很多方法自己有實現,例如respondsToSelector:和isKindOfClass,這樣的話就不會走消息轉發(fā)流程。(消息轉發(fā)是只有當接收者無法處理時才會通過forwardInvocation:來尋求能夠處理的對象.)

總結:NSProxy比NSObject更干凈。

注意:NSProxy這個基類沒有定義默認的init方法.

NSProxy類

iOS中分類和繼承的區(qū)別

? 在OC中,擴展一個類的方式有兩種:繼承與分類。

? 繼承與分類最大的區(qū)別是,一般情況下,分類不能擴展屬性,繼承可以擴展屬性。但有一種情況下,分類可以擴展屬性,那就是在本類中寫的分類。

? ? ?這里解釋下,屬性與成員變量的關系。

? ? 屬性: 聲明一個屬性,則系統(tǒng)會默認給生成讀取函數(set,get),可以通過點運算符來默認調用這個存取方法,并且會產生一個以_開頭的成員變量。

? ? ?屬性就是與屬性相對應的成員變量的值。在使用屬性的時候,其實本質也是對成員變量的值進行操作。

? ? ?成員變量:則是單純的一個變量,不會有連帶的存取方法。

? ? ?屬性是暴露在外面的,可以供外面進行訪問調用的。而成員變量默認是protected的,保護的成員,如果被設置為public才允許外部對象調用,否則,是訪問不到的。

? ? 現在回到繼承與分類的話題上來。。。

1.繼承Inherit

? ? 繼承是任何一個面向對象的語言都有的特性。子類可以繼承父類的屬性與方法。

? ?有兩種情況下,必須需要使用繼承,而不能使用分類的。

? ? a. 當需要擴展的方法與原方法同名時,并且需要調用父類的同名方法,則需要繼承。若此時使用分類,則分類的方法的實現會覆蓋原方法的實現,不會訪問到原方法。

? ? b. 當需要擴展屬性時。

2. 類別:

? ? 這是OC特有的屬性,可以在不改變類名和原類的實現的前提下,進行類的擴展。

? ?以下幾種情況,最好使用分類:

?a. 針對系統(tǒng)的一些類進行擴展。例如,NSString, NSArray, NSNumber等類,系統(tǒng)本身不提倡使用繼承去擴展方法,因為這些類內部實現對繼承有所限制,所以最好用分類的方式擴展。

? ? b.類別支持開發(fā)人員針對自己構建的類,把相關的方法分組到多個單獨的文件中,針對大型而復雜的類,可以提高維護性和可讀性,并簡化單個源文件的管理。

ps: 類別形式的擴展還分為Category 和 Extension.在Xcode中創(chuàng)建文件時,這兩種文件被區(qū)分開來了。

? ? ? ?Category與Extension的區(qū)別:

? ? ? 1. Extension 是匿名的Category。

? ? 2. Extension 定義的方法,須在類的implement 中實現,而category不強求。

? ? 3. Extension可以定義屬性,而Category不能定義屬性。


新聞標題:ios開發(fā)繼承,iOS開發(fā)吧
標題網址:http://weahome.cn/article/dscpdhs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部