類的結(jié)構(gòu)初探

本篇文章針對類的結(jié)構(gòu)進(jìn)行初步的分析定页,對之前學(xué)習(xí)的內(nèi)容做一個(gè)小小的總結(jié)迅耘。

文章的分析主要是利用lldb斷點(diǎn)調(diào)試,通過查看類的內(nèi)存空間冤馏,分析定位類的實(shí)例變量日麸、屬性、對象方法和類方法在編譯之后的存儲位置逮光。

1代箭、首先在main方法中添加代碼,并且在NSLog那一行打上斷點(diǎn):

涕刚、嗡综、、

int?main(int?argc,const?char* argv[]) {

? ? @autoreleasepool {

? ? ? ? LGPerson*person = [LGPerson alloc];

? ? ? ? Class pClass ? =object_getClass(person);

? ? ? ? NSLog(@"%@ - %p",person,pClass);

? ? }

?? ?return0;

}

杜漠、极景、、

2驾茴、然后通過命令查看pClass的內(nèi)存地址:

盼樟、、锈至、

?x/4gx pClass

0x1000023b0: 0x001d800100002389 0x0000000100afe140

0x1000023c0: 0x00000001003a1270 0x0000000000000000

晨缴、、峡捡、

通過分析objc_class結(jié)構(gòu)體的定義:

击碗、、棋返、

struct objc_class : objc_object {

? ? // Class ISA; // 8延都,繼承自父類

? ? Class superclass; // 8

? ? cache_t cache;? ? // 16 不是8? ? ? ? // formerly cache pointer and vtable

? ? class_data_bits_t bits;? ? // class_rw_t * plus custom rr/alloc flags

? ? class_rw_t*data() {?

? ? ? ? returnbits.data();

? ? }

......

}

、睛竣、晰房、

可以定位到bits的內(nèi)存初始位置:0x1000023b0 + 20(偏移量)=?0x1000023d0

3、輸入命令:

射沟、殊者、、

p (class_data_bits_t *)0x1000023d0

(class_data_bits_t *) $1 = 0x00000001000023d0

p $1->data()

(class_rw_t *) $2 = 0x0000000100f90810

p *$2

(class_rw_t) $3 = {

? flags = 2148139008

? version = 0

? ro = 0x0000000100002308

? methods = {

? ? list_array_tt = {

?? ? ? = {

? ? ? ? list = 0x0000000100002240

? ? ? ? arrayAndFlag = 4294976064

? ? ? }

? ? }

? }

? properties = {

? ? list_array_tt = {

?? ? ? = {

? ? ? ? list = 0x00000001000022f0

? ? ? ? arrayAndFlag = 4294976240

? ? ? }

? ? }

? }

? protocols = {

? ? list_array_tt = {

?? ? ? = {

? ? ? ? list = 0x0000000000000000

? ? ? ? arrayAndFlag = 0

? ? ? }

? ? }

? }

? firstSubclass = nil

? nextSiblingClass = NSDate

? demangledName = 0x0000000000000000

}

验夯、猖吴、、

4.猜測:有關(guān)屬性挥转、方法和協(xié)議的相關(guān)信息分別存在$3的properties海蔽、methods和protocols中共屈,但是通過p(po)命令查看,猜測錯(cuò)誤党窜。它們真正的位置在$3的ro里面拗引,下面去一一驗(yàn)證。

5.驗(yàn)證

幌衣、矾削、、

(lldb) p *$3.ro

(const class_ro_t) $5 = {

? flags = 388

? instanceStart = 8

? instanceSize = 24

? reserved = 0

? ivarLayout = 0x0000000100001f89 "\x02"

? name = 0x0000000100001f80 "LGPerson"

? baseMethodList = 0x0000000100002240

? baseProtocols = 0x0000000000000000

? ivars = 0x00000001000022a8

? weakIvarLayout = 0x0000000000000000

? baseProperties = 0x00000001000022f0

}

p *$5.baseProperties

(property_list_t) $6 = {

? entsize_list_tt = {

? ? entsizeAndFlags = 16

? ? count = 1

? ? first = (name = "nickName", attributes = "T@\"NSString\",C,N,V_nickName")

? }

}

p *$5.baseMethodList

(method_list_t) $7 = {

? entsize_list_tt = {

? ? entsizeAndFlags = 26

? ? count = 4

? ? first = {

? ? ? name = "sayHello"

? ? ? types = 0x0000000100001f8b "v16@0:8"

? ? ? imp = 0x0000000100001b90 (LGTest`-[LGPerson sayHello] at LGPerson.m:13)

? ? }

? }

}

p *$5.ivars

(const ivar_list_t) $8 = {

? entsize_list_tt = {

? ? entsizeAndFlags = 32

? ? count = 2

? ? first = {

? ? ? offset = 0x0000000100002378

? ? ? name = 0x0000000100001e64 "hobby"

? ? ? type = 0x0000000100001fa6 "@\"NSString\""

? ? ? alignment_raw = 3

? ? ? size = 8

? ? }

? }

}

豁护、哼凯、、

但是楚里,類方法并沒有保存在 baseMethodList里面断部,而是保存在元類里面。

但是腻豌,類方法并沒有保存在 baseMethodList里面家坎,而是保存在元類里面嘱能。

但是吝梅,類方法并沒有保存在 baseMethodList里面,而是保存在元類里面惹骂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苏携,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子对粪,更是在濱河造成了極大的恐慌右冻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件著拭,死亡現(xiàn)場離奇詭異纱扭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)儡遮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乳蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鄙币,你說我怎么就攤上這事肃叶。” “怎么了十嘿?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵因惭,是天一觀的道長。 經(jīng)常有香客問我绩衷,道長蹦魔,這世上最難降的妖魔是什么激率? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮勿决,結(jié)果婚禮上柱搜,老公的妹妹穿的比我還像新娘。我一直安慰自己剥险,他們只是感情好聪蘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著表制,像睡著了一般健爬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上么介,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天娜遵,我揣著相機(jī)與錄音,去河邊找鬼壤短。 笑死设拟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的久脯。 我是一名探鬼主播纳胧,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘撰!你這毒婦竟也來了跑慕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摧找,失蹤者是張志新(化名)和其女友劉穎核行,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹬耘,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芝雪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了综苔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惩系。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖休里,靈堂內(nèi)的尸體忽然破棺而出蛆挫,到底是詐尸還是另有隱情,我是刑警寧澤妙黍,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布悴侵,位于F島的核電站,受9級特大地震影響拭嫁,放射性物質(zhì)發(fā)生泄漏可免。R本人自食惡果不足惜抓于,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浇借。 院中可真熱鬧捉撮,春花似錦、人聲如沸妇垢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯估。三九已至灼舍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涨薪,已是汗流浹背骑素。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刚夺,地道東北人献丑。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像侠姑,于是被迫代替她去往敵國和親创橄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容