iOS 類的結構初探

不寒暄直接切入主題

問題:

1 class 底層結構包含什么屬性

2 實例變量存在底層哪里

3 屬性底層如何存放

4普通方法的存放

5類方法的存放

#import

NS_ASSUME_NONNULL_BEGIN

@interface?LGPerson : NSObject{

? ? NSString*hobby;

}

@property?(nonatomic,?copy) NSString *nickName;

- (void)sayHello;

+ (void)sayHappy;

@end

首先我們定義一個類,里面有?hobby成員變量,nickName屬性,?sayHello方法和一個sayHappy類方法

定義一個? ? ? ? LGPerson*person = [LGPerson?personalloc];;萬物結對象

通過? ? ? ? Class pClass =object_getClass(person);拿到當前對象的class

Class 獲取


Class->objc_class->objc_object 繼承關系

objc_class該類里面是有三個屬性加父類一個屬性總共是四個屬性

?Class_Nonnull?isa? OBJC_ISA_AVAILABILITY;

? ? Class superclass; // 8

? ? cache_t cache;? ? // 16? ? ??

? ? class_data_bits_t bits;?

Class 繼承 objc_class
objc_calss 內(nèi)部實現(xiàn)


objc_class 繼承objc_object ,objc_object 內(nèi)部構造

打印上述所拿到class

(lldb)?x/4gx pClass

0x1000025f8: 0x001d8001000025d1 0x0000000100b38140

0x100002608: 0x0000000100f49350 0x0000000400000007

四個屬性對應四個地址

即 isa ->0x001d8001000025d1? ? 8位

superclass ->0x0000000100b38140? 8位

cache->0x0000000100f49350? 16位

class_data_bits_t->0x0000000400000007

第一位 isa跟類的關系驗證

(lldb)?po 0x001d8001000025d1 & 0x00007ffffffffff8

LGPerson

isa 與上 掩碼 就是當前類

isa 地址打印

第二位 superclass驗證?

(lldb)?po 0x0000000100b38140

NSObject??

打印superclass內(nèi)存地址驗證LGPerson 繼承與NSObject

第三位??cache? 先不做驗證,為啥,因為我也不知道 捂臉.jpg

第四位 bits重點 探討

class_data_bits_t bits;

? ? class_rw_t*data() {?

?returnbits.data();

? ? }

bits 和 data()函數(shù)的關系

可知 data該函數(shù)bits可調(diào),進class_rw_t

class_rw_t 內(nèi)部實現(xiàn)

是不是若有所思,對屬性,方法,都在這個里面

我們一步一步進行打印

(lldb)?x/4gx pClass

0x100002600: 0x001d8001000025d9 0x0000000100b38140

0x100002610: 0x00000001018205f0 0x0000000300000003


class 打印

0x100002600 這個東西為該類地址,也是該類第一個屬性isa的地址

為啥,因為類的第一個屬性的地址就是該類的地址

isa->8位? superclass->8位 cache->16位,可知第一個屬性地址評議32位幾位第四位屬性地址

bits 數(shù)據(jù)打印

直接取 $3里面的數(shù)據(jù),

是不是,不是很驚訝

其實,還有更驚訝的就是 ro,哪來ro


又是class_rw_t

下圖 class_ro_t 內(nèi)部構造

class_ro_t 內(nèi)部構造

我們接著打印ro,一定要把所謂的成員變量,屬性,類方法拋出來

內(nèi)部數(shù)據(jù)打印

ivars->存儲成員變量

為什么我只定義了一個 hobby? _nickName哪來的,

因為屬性在編譯時會生成一個_屬性名的實例變量

下面屬性

屬性打印

屬性存在于baseProperties?

對就是這個nickName ,count=1 只有這么一個

下面方法

count = 4

LGPerson sayHello]

[LGPerson .cxx_destruct]

[LGPerson nickName]

[LGPerson setNickName:]

屬性在編譯的時候回自動生成setter getter 方法

問題來了+ (void)sayHappy; 這個類方法呢

編譯完了該類居然沒有

下面我們用一個某人居然說笨的方法來查找一下

類方法存在于元類

看見沒有元類里面居然有該方法的地址

說明實例變量編譯到了元類里面

-------------------------------------戛然而止分界線------------------------------------------------------------------

此次Class結探討完畢, 由于技術不是很純屬,不足之處還請大神賜教?

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容