日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分类、继承、类别

發布時間:2023/12/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分类、继承、类别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一)category
category的主要作用是為已經存在的類添加方法

可以把類的實現分開在幾個不同的文件里面
? 可以減少單個文件的體積
? 可以把不同的功能組織到不同的category里
? 可以由多個開發者共同完成一個類
? 可以按需加載想要的category
聲明私有方法

category的其他幾個使用場景:
? 模擬多繼承(另外可以模擬多繼承的還有protocol)
? 把framework的私有方法公開

category特點
? category只能給某個已有的類擴充方法,不能擴充成員變量。
? category中也可以添加屬性,只不過@property只會生成setter和getter的聲明,不會生成setter和getter的實現以及成員變量,需要使用runtime 來實現。
? 如果category中的方法和類中原有方法同名,運行時會優先調用category中的方法。也就是,category中的方法會覆蓋掉類中原有的方法。所以開發中盡量保證不要讓分類中的方法和原有類中的方法名相同。避免出現這種情況的解決方案是給分類的方法名統一添加前綴。比如category_。
? 如果多個category中存在同名的方法,運行時到底調用哪個方法由編譯器決定,最后一個參與編譯的方法會被調用。
調用優先級
? 分類(category) > 本類 > 父類。即,優先調用cateory中的方法,然后調用本類方法,最后調用父類方法。
注意:category是在運行時加載的,不是在編譯時。
為什么category不能添加成員變量?
因為在運行期,對象的內存布局已經確定,如果添加實例變量就會破壞類的內部布局,這對編譯型語言來說是災難性的
Objective-C類是由Class類型來表示的,它實際上是一個指向objc_class結構體的指針,
在Runtime中,objc_class結構體大小是固定的,不可能往這個結構體中添加數據,只能修改
需要注意的有兩點:
? 1)、category的方法沒有“完全替換掉”原來類已經有的方法,也就是說如果category和原來類都有methodA,那么category附加完成之后,類的方法列表里會有兩個methodA。
? 2)、category的方法被放到了新方法列表的前面,而原來類的方法被放到了新方法列表的后面,這也就是我們平常所說的category的方法會“覆蓋”掉原來類的同名方法,這是因為運行時在查找方法的時候是順著方法列表的順序查找的,它只要一找到對應名字的方法,就會罷休,殊不知后面可能還有一樣名字的方法。
修改

(二)Extension
extension被開發者稱之為擴展、延展、匿名分類。extension看起來很像一個匿名的category,但是extension和category幾乎完全是兩個東西。和category不同的是extension不但可以聲明方法,還可以聲明屬性、成員變量。extension一般用于聲明私有方法,私有屬性,私有成員變量。
注意:extension常用的形式并不是以一個單獨的.h文件存在,而是寄生在類的.m文件中。
category和extension的區別
就category和extension的區別來看,我們可以推導出一個明顯的事實,extension可以添加實例變量,而category是無法添加實例變量的(因為在運行期,對象的內存布局已經確定,如果添加實例變量就會破壞類的內部布局,這對編譯型語言來說是災難性的)。

? extension在編譯期決議,它就是類的一部分,但是category則完全不一樣,它是在運行期決議的。extension在編譯期和頭文件里的@interface以及實現文件里的@implement一起形成一個完整的類,它、extension伴隨類的產生而產生,亦隨之一起消亡。 ? extension一般用來隱藏類的私有信息,你必須有一個類的源碼才能為一個類添加extension,所以你無法為系統的類比如NSString添加extension,除非創建子類再添加extension。而category不需要有類的源碼,我們可以給系統提供的類添加category。 ? extension可以添加實例變量,而category不可以。 ? extension和category都可以添加屬性,但是category的屬性不能生成成員變量和getter、setter方法的實現。

(三)繼承
適用繼承的場合

  • 父類只是給子類提供服務,并不涉及子類的業務邏輯
  • 層級關系明顯,功能劃分清晰,父類和子類各做各的。
  • 父類的所有變化,都需要在子類中體現,也就是說此時耦合已經成為需求
    4.在我看來一個很重要的原則就是我們不能脫離cocoa框架開發,所以我們可以繼承cocoa的類,以達到快速開發的目的,但是如果沒有特殊原因我們寫的代碼要控制在繼承鏈不增加兩層。
  • 轉載于:https://www.cnblogs.com/shidaying/p/8260019.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的分类、继承、类别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。