ObjC中的類和例項物件

2021-09-11 15:40:22 字數 2420 閱讀 3549

oc中類的本質是乙個結構體

nsobject類中存在乙個class型別的isa指標。 我們在xcode編寫乙個類繼承於nsobject,在terminal使用xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xx.m -o xx.cpp將.m檔案轉成.cpp檔案,窺探nsobject的底層實現。

我們發現nsobject類最後轉成了乙個通過typedef struct objc_object nsobject定義的結構體,這大抵就是nsobject的底層實現了。我們在oc中定義的乙個類就是乙個c語言的結構體。

定義乙個student繼承自person類,宣告乙個成員變數int no;,依然使用上述命令將其轉成cpp檔案,窺探student的底層實現。

其中student結構體中存在乙個person_impl的結構體,這就是student的父類。由於我在person類中宣告了乙個成員變數age,所以下面是person_impl的結構體的定義。

而 person中又存在乙個nsobject_impl結構體,這是因為person繼承於nsobject。關於nsobject_impl在上面已經介紹過,不做贅述。上述關係可以通過下圖來表示。

oc中的物件主要可以分為例項物件、類物件、元類物件三種。

instance物件就是通過類alloc出來的。例項物件中儲存著乙個isa指標和一些成員變數

每個類有且只有乙個類物件,class物件中存放著乙個isa指標,乙個superclass指標,類的屬性資訊,類的物件方法資訊,類的協議方法資訊,類的成員變數資訊等,其本質是乙個objc_class的結構體。

每個類有且只有乙個元類物件,元類物件的結構跟類物件是一樣只不過用途不一樣。可以通過runtime的class_ismetaclass來驗證某個類是不是元類,其本質是乙個objc_class的結構體。

上圖我們可以看出:

在物件分類的類物件和元類物件中已經描述過其中存放的資料,並且說明元類中存放著和類物件一樣結構的資料。

上述是在.cpp檔案中找到的類結構體的定義,但是在條件編譯的時候已經明確指出,在objc2已經不可用了。於是在runtime原始碼中有這樣乙個新的定義。

這是乙個c++的結構體,他繼承自objc_object,objc_object中有乙個isa的成員變數和一些方法。

所以objc_class中存在乙個isa,superclass指標,以及方法的快取和類資訊資料(bits)。第乙個方法class_rw_t *data()中呼叫了bits的data()函式,返回了乙個class_rw_t型別的結構體。

其中存放有方法列表、屬性列表、協議列表等,其中還有乙個class_ro_t的結構體,裡面存放了類的基本資訊,包括例項的大小,類名等。

我們知道了類的本質和結構,那麼我們可以自己定義乙個結構體,裡面有跟類一樣的變數,將我們的類轉換成這個結構體,來驗證class的結構。

使用mj大大編寫的mjclassinfo,定義兩個類,person(乙個成員變數、乙個屬性、乙個類方法、乙個例項方法),student(乙個成員變數、乙個類方法、乙個例項方法,乙個協議),將其轉換成相應的結構體型別,這裡面是mj_objc_class。

我們可以看出定義的例項方法放在method中,屬性放在properties中,成員變數在ro的ivars中...

在student中遵守了乙個協議,協議放在類的協議列表中:

我們可以看到protocols的count為1,而person沒有遵守協議所以其protocols的count為0。

使用mjclassinfo中的meta()方法獲取元類並呼叫元類結構體的data()方法窺探元類的結構:

我們可以看出metaclass的結構與class 的結構一樣,只不過儲存的資料不一樣。我們定義的類方法儲存在metaclass的method中。

乙個nsobject* obj = [[nsobject alloc] init];例項物件佔多少記憶體空間?

答:由於nsobject例項物件就是c語言中的結構體,而這個結構體中僅有乙個isa指標,所以其使用的記憶體空間就是乙個指標的記憶體空間。系統為nsobject物件分配了16個位元組的空間,但是在64位系統中實際使用的只有8個位元組,32位系統中實際使用的是4個位元組。

2.物件的isa指標指向**?

答:通過isa和superclass的圖例可以看出例項物件的isa指標指向類物件,類物件的isa指標指向其元類物件,元類物件的isa指標你指向基類。而子類和父類的isa以及元類的isa指標皆指向元類的基類。

c 中的類 物件和例項

以前老有人搞不清類 物件和例項之間的關係,下面說說我的個人理解 1 物件說穿了就是乙個變數,是存在棧中,例如 star star new star 其中star是乙個物件,只不過是對引用型別的變數的另一種稱呼罷了 2 例項是存在堆中的,如 new star 這個例項,是沒有名字的,存放於堆中,那我們...

PYTHON中的例項,類,物件和屬性

python中一切皆為物件,所謂物件 我自己就是乙個物件,我玩的電腦就是物件,坐著的椅子就是物件,家裡養的小狗也是乙個物件。我們通過描述屬性 特徵 和行為來描述乙個物件的。比如家裡的小狗,它的顏色,大小,年齡,體重等是它的屬性或特徵。它會汪汪叫,會搖尾巴等是它的行為。我們在描述乙個真實物件 物體 時...

python類物件和例項物件

類物件支援兩種操作 屬性引用和例項化。屬性引用 使用 python 中所有屬性引用所使用的標準語法 obj.name。有效的屬性名稱是類物件被建立時存在於類命名空間中的所有名稱。因此,如果類定義是這樣的 a example class i 12345 def f self return hello ...