class和object getClass方法區別

2021-10-24 23:59:24 字數 2109 閱讀 9918

如上圖:

1.記憶體建立乙個instance例項物件(person *per),同時會建立乙個與之對應的類物件(class perclass)和元類物件(class permeta);

注:例項物件通過calloc可建立多個,但類物件和元類物件在記憶體中只有乙份,只建立一次;

2.物件的本質,其實是c語言的結構體struct,各個物件的記憶體結構為:

per:isa指標+僅儲存person類成員變數的值;

person:isa指標+superclass指標+儲存成員變數的型別、名稱,協議,物件方法等;

permeta:isa指標+superclass指標+僅儲存類方法;

3.isa指向:

per:指向類物件person;

person:指向元類物件permeta;

permeta:指向基類(root,如:nsobject)的元類物件meta(基類的元類物件的isa指向該元類物件自己);

4.superclass指向:

person:指向父類》基類的類物件指向nil;

permeta:指向父類》基類的元類物件指向該基類的類物件;

1)通過例項物件per獲取類物件

- (void)viewdidload ;

struct lyb_objc_class *pergetclass3 = (__bridge struct lyb_objc_class *)object_getclass(self.per1);

//lldb模式:

說明:1.pergetclass2和pergetclass3指的是同乙個類物件;

2.permeta1的位址跟pergetclass2和pergetclass3的位址是相同的,說明此時class並沒有返回元類物件,依然是類物件;

3.permeta2的位址和pergetclass3->isa指向的位址相同,說明object_getclass返回的是元類物件;

4.元類物件的類名稱和類物件的一樣,依然是person;

3)通過元類物件獲取基類的元類物件

//新增**

struct lyb_objc_class *permeta3 = (__bridge struct lyb_objc_class *)object_getclass(pergetclass2);

//還是permeta2

class rootmeta1 = [permeta2 class];

//基類(nsobject)的元類物件

class rootmeta2 = object_getclass(permeta2);

//lldb模式: 

說明:1.class返回的依然是元類物件自身,object_getclass返回的是基類的元類物件;

2.基類的元類物件的類名跟類物件的一樣,為nsobject;

當訊息物件為例項物件instance時,class與object_getclass返回的物件位址一樣;當訊息物件為類物件,或元類物件時,class返回的訊息物件本身,而object_getclass返回的是下乙個物件;

原因:因為class返回的是self,而object_getclass返回的是isa指向的物件;

說明:以上原始碼查詢在github上有演示;

補充:class <=> objc_getclass

import和 include和 class用法

include 用於對系統檔案的引用,編譯器會在系統檔案目錄下去查詢該檔案。include xx.h 用於對使用者自定義的檔案的引用,編譯器首先會去使用者目錄下查詢,然後去安裝目錄,最後去系統目錄查詢。注意 include 如果class a 匯入了class b,class b的標頭檔案裡又匯入了...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...

struct和class的關係

一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。除了這兩點,class和struct基本就是乙個東西。語法上...