OC課程筆記總結9 核心語法4 分類

2021-07-02 07:57:18 字數 3867 閱讀 6871

課程:核心語法

category :分類,類目,類別,在oc中經常使用。分類是依賴於類的,先有類再有分類。類和分類都是同一種類,而分類可以在這種類的基礎上進行一些方法的擴充,而不用通過繼承建立乙個新的類再進行擴充。注意的是分類只能擴充類的方法(類方法和物件方法都可以),不能擴充類的屬性。乙個類可以有多個分類,每個分類都有自己的名稱。但是要記住,分類和類都是同一種類。

定義分類的格式:

@inte***ce 類名 (分類名)

分類方法宣告

@end

@implementation 類名 (分類名)

分類方法實現

@end

在實際開發中如果遇上某些類十分龐大,乙個類中有幾百甚至上千個方法,這時候可以通過分類來對方法進行劃分,便於管理和維護。

在團隊開發中,可以不同的人員共同構造乙個類,每個人員寫同乙個類的不同部分,通過分類組合成為乙個最終的類。通過包含不同分類的標頭檔案即可將不同分類組合在一起,成為乙個完整的類。實際開發中分類按照分模組來寫,並用模組來命名。

分類的作用就是在不改變原來類的內容的基礎上,為這個類擴充一些方法。並且分類只能擴充方法,不能擴充屬性。在分類的方法中,可以訪問類的成員變數。對於同名的方法,分類的優先順序是最高的,物件呼叫某個方法時先去找分類中的方法。查詢順序為 :分類,類,父類,父類的父類。。。超類。

但是分類中的方法並不是重寫,而是覆蓋,如果在分類中定義了乙個和類中同名的方法,那麼就是覆蓋掉類中的方法,物件永遠不能再呼叫原來類中的方法,只能呼叫分類的方法。而對於不同的分類中的同名方法,根據編譯器編譯的順序來決定最後留下的是哪個方法,最後編譯的分類就是最後留下的方法,而編譯的順序是按照標頭檔案的宣告順序來決定的,並且編譯器在編譯時只對。m和。c檔案進行編譯,。h檔案只是宣告作用,並不會實際編譯。

由於分類中的同名方法會發生覆蓋現象,因此不建議在分類中定義同名的方法。

在開發過程中,多數是為系統自帶類進行分類擴充,而不是對自定義的類進行擴充。當系統自帶的類的方法不能滿足功能需求時,就可以通過分類進行方法擴充。而系統自帶的類的源**是閉源的。分類名一般按功能命名,並且分類名和類名首字母都大寫。

題外補充:對於字元一定要使用單引號『』引用,對於數字字元也一樣。

分類擴充的方法可以被類的物件或者類直接呼叫,而不用加註標識,只要方法名對應即可。

專案開發中要養成 分文別類的好習慣,對於不同的模組放在不同的資料夾中。

類的深層研究:

oc中的類的本質也是乙個物件,oc是源自c,開上去oc是物件導向的,實際的底層還是面向過程的。

任何類在使用時都會首先載入進記憶體中,但是每種類只載入1次,相當於建立了乙個類物件。而建立物件後,物件的方法實際上是放在類中的。所有的例項物件的isa指標都指向類物件,而類物件的isa指標指向這個類的元類物件。

類本身也是乙個物件,只要是物件就是有型別,而類物件的型別就是類型別:class    //  注意,不要加*號。既然類也是乙個物件,那麼就會有自己的屬性,其中乙個屬性就是class,這個屬性表明了這個物件是屬於哪個類的。

類a的例項物件的類屬性是類a,並且類a的類物件的類屬性也是類a。

所以這個屬性的資料型別是類型別,即乙個指向什麼類的指標,但是不需要加*號。同時系統中也自帶了乙個get屬性的方法:【類物件 class】,這個方法就會返回的是乙個指標,輸出指標得出的結果是這個指標所指向的位址的值,用%p接收指標的值(p相當於16進製制輸出)。任何物件呼叫class 方法都可以得到乙個指向這個物件的類的指標,即獲得這個類的類物件。

其實在oc中所有的方法都必須是有物件呼叫的,通常所說的類方法由類呼叫,其實是指有類物件呼叫,物件方法由例項物件呼叫,例項物件源於類物件。

類=類名=類物件。

獲取類物件的方式有兩種,一種是物件呼叫物件方法,另一種是類物件呼叫類方法。其實類方法就是類物件的方法。物件方法是例項物件的方法。

但得到的都是同乙個類物件。因為在記憶體中每個類的類物件只有乙個。

類的載入過程和初始化。

只要程式一啟動就會載入所有的類進入記憶體中,載入的順序是先父類後子類。

有這樣乙個類方法:+(void)load,這個方法在類載入的時候執行,每個類只載入一次。只要程式一啟動,就會載入類,而載入類就會呼叫load方法,所以load方法是一定會執行的方法,如果在程式中某些類根本沒被使用到,甚至主函式中沒有包含這些類的標頭檔案,只要這些類是在同乙個專案資料夾中,那麼一樣會被載入進記憶體中。

目前最新版本的xcode已經無法這樣實現這個函式的功能了?

另乙個函式 +(void) initialize 則是在類第一次 使用的時候呼叫,用到類即用到類物件,在呼叫類方法比如new或者或者alloc或者init方法時就是用到了類,這時候initialize方法就會呼叫。

分類也會同樣載入,只要分類在這個專案中,即使沒有包含標頭檔案宣告,即使沒有使用這個類,load 也一樣會被呼叫。load 是載入時呼叫的函式,因此不管類還是分類都會被載入,load都會被呼叫。

而如果分類中定義了initialize方法,那麼在第一次使用類時優先使用分類的這個方法,即類的方法被覆蓋,呼叫的是分類的方法。

目前最新版本的xcode中已經無法實現。

先載入父類,再載入子類,先初始化父類,在初始化子類,先呼叫父類的load,在呼叫子類的load,可以通過initialize方法來監聽某個類什麼時候被使用。

description(描述) 方法:

有兩種的description 方法

- description

+ description

接收乙個物件型別用於列印輸出用%@接收,可以把整個物件的屬性一次性列印出來而不用單獨列印。但是在預設情況下,用nslog輸出乙個物件輸出的是物件所在的記憶體位址,輸出是《類名 記憶體位址》。

具體的過程是先呼叫物件的- descripton 方法,這一方法返回值是乙個oc的字串物件(nsstring *),所以用%@來接收,預設返回的字串就是《類名 記憶體位址》

要想一次列印出物件的屬性,重寫子類的description方法即可,因為同名方法以子類的方法優先。

拼串用nsstring 的乙個類方法:stringwithformat,並且這個方法可以接收帶有引數的變數值,然後在拼起來,這個方法會經常使用。

如果是要列印輸出乙個類(即類物件),那麼系統首選使用的是+ description 方法,預設返回值也是乙個字串,返回型別是《類名》 沒有記憶體位址值。

總的來說,列印輸出的是例項物件,就用例項物件的方法,列印輸出的是類,就用類的方法。要想改變輸出的結果,那麼就重寫對應的方法即可。

nslog不僅可以輸出物件和類,還能輸出很多東西,詳細可以參考官方的文件,

sel 型別:

sel型別是一種資料型別。這種型別的變數代表方法。乙個sel型別的資料就代表乙個方法。有類才能有方法。在類中包含了方法列表。每個方法都有乙個相對於的sel資料。一對一,乙個方法乙個sel資料。

而每個物件中都有乙個isa指標指向類,包括類物件,也有指標指向元類。方法都存在類中,物件根據isa指標找到自己所屬的類,然後獲得相關的方法。

系統會把方法封裝成為sel型別的資料,物件會同sel資料找到對應的方法。其實sel資料實際對應的是方法的位址。有了位址就可以找到方法,然後就可以呼叫方法。找方法的過程是快取的,找過一次就會記錄下來,然後再呼叫

方法時就不用再找一次了,這樣會提高程式執行的速度。使用@selector(方法名) 就可以獲得 方法的位址。如果方法是有引數的,那麼方法名是包括冒號和描述引數資訊的說明的,方法名要寫全。

sel 是selector的縮寫,對應著方法。訊息機制中的訊息指的就是sel,發出這個訊息找到對應的方法並呼叫。

每個類的例項物件方法列表都存在類物件中,而類物件的物件方法存在於元類中。系統中還隱藏了乙個屬性 _cmd,這個屬性也是乙個sel資料,每個方法的記憶體中都有著這麼乙個資料,這個資料對應了乙個方法,

這個方法就是當前方法,即指向了自己。記住sel找的是方法的位址,通過位址找到方法。

通過sel找位址再呼叫方法是比較消耗效能的,如果某個方法經常呼叫的話還會有優化的方法。

OC課程筆記總結8 核心語法3 構造方法

課程 核心語法 首先必須理解兩個重要的內容 1,self,2,super self,永遠指向的是當前的物件,而判斷當前物件到底是哪乙個是通過最外層的中括號中是哪乙個物件,而不是某個方法或者屬性所屬於的類或者物件。這一點體現在 self super init 中,super是指呼叫父類的方法init,...

學習筆記 OC核心語法

1 利用點語法替換set方法和get方法 方法呼叫 student stu student new stu setage 100 int age stu age 點語法 stu.age 100 int age stu.age 2 點語法的本質 其實點語法的本質還是方法呼叫 當使用點語法時,編譯器會自...

OC新語法總結

1.方法與順序無關 2.列舉繫結資料型別 enum typedef nsuinteger language 3.屬性不用寫 synthesize 4.語法簡化 4.1 nsnumber nsnumber value value 12345 value 123.45f value 123.45 val...