isa的作用與內(nèi)部結(jié)構(gòu)(上)

一滔以、回顧

oc對(duì)象的本質(zhì)就是一個(gè)結(jié)構(gòu)體四濒,結(jié)構(gòu)體的內(nèi)部包含一個(gè)isa指針

指針:是一種保存變量地址的變量奴愉。

//OC
@interface NSObject{
  Class isa; // 包含一個(gè)isa指針(地址值)
}
// 對(duì)應(yīng)的 C
struct NSObject_IMPL{
  Class isa;
}
//typedef起別名 Class是指向objc_class的指針 
typedef struct objc_class *Class; 
isa->Class->objc_class isa保存的地址存儲(chǔ)著obj_class結(jié)構(gòu)體
// isa 本質(zhì)就是一個(gè)指向 objc_class 結(jié)構(gòu)體的指針

二蔬螟、實(shí)例對(duì)象的isa

實(shí)例對(duì)象保存了變量的值此迅,沒有保存方法等其他的信息,那么實(shí)例對(duì)象調(diào)用方法的時(shí)候旧巾,是如何找到正確的方法呢耸序?

isa 將類對(duì)象的地址保存到isa中 ,調(diào)用方法的時(shí)候鲁猩,通過isa尋找到類對(duì)象坎怪,然后調(diào)用類對(duì)象中保存的方法

同理類對(duì)象的isa指向元類對(duì)象,可以獲取到元類對(duì)象中保存的類方法

三廓握、元類對(duì)象的isa

元類對(duì)象后面只剩下基類的元類對(duì)象搅窿,所以每個(gè)元類對(duì)象的isa都是直接指向基類 即 NSObject 的元類對(duì)象,而基類的元類對(duì)象指向它自己隙券。


image.png

四男应、舉例證明

 // 實(shí)例化
 Person *p = [[Person alloc] init];
// 獲取類對(duì)象地址
Class person_class = [Person class];
// 獲取元類對(duì)象的地址
Class person_meta_class = object_getClass(person_class);
// 打印p->isa 
(lldb) p/x (long)p->isa  //x表示轉(zhuǎn)化為十六進(jìn)制
(long) $0 = 0x001d800100001149
// 打印 person_class地址,查看p->isa是否已person_class地址一致
(lldb) p/x person_class
(Class) $1 = 0x0000000100001148 Person

兩次打印結(jié)果不一致
在64位之后娱仔,isa的內(nèi)存地址需要&一個(gè)掩碼值殉了,才能獲取到真正的內(nèi)存地址

# if __arm64__ 
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
# elif __x86_64__
#   define ISA_MASK        0x00007ffffffffff8ULL
#   define ISA_MAGIC_MASK  0x001f800000000001ULL
#   define ISA_MAGIC_VALUE 0x001d800000000001ULL
(lldb) p/x 0x001d800100001149 & 0x00007ffffffffff8
(long) $4 = 0x0000000100001148
(lldb) p/x person_class
(Class) $1 = 0x0000000100001148 Person
這次確實(shí)兩次地址值一致

由此可見實(shí)例對(duì)象的isa確實(shí)是指向了類對(duì)象的內(nèi)存地址
若要證明 類對(duì)象的isa指向元類對(duì)象,需要自定義一個(gè)objc_class

struct pf_objc_class {
    Class isa;
};
// 將類對(duì)象轉(zhuǎn)化為pf_objc_class結(jié)構(gòu)體拟枚,才能獲取到類對(duì)象的isa
struct pf_objc_class *person_class2 = (__bridge struct pf_objc_class *)(person_class);
// 類對(duì)象的isa地址
(lldb) p/x person_class2->isa
(Class) $5 = 0x001d800100001121
// 元類對(duì)象的實(shí)際地址
(lldb) p/x person_meta_class
(Class) $6 = 0x0000000100001120
// 同樣將類對(duì)象的isa值&掩碼值后等于元類對(duì)象的地址
(lldb) p/x 0x001d800100001121 & 0x00007ffffffffff8
(long) $7 = 0x0000000100001120

舉例證明isa變量的內(nèi)存地址薪铜,就是對(duì)象的內(nèi)存地址

(lldb) p p // 打印p的地址
(Person *) $9 = 0x0000000100541d80
(lldb) p &p->isa // 打印isa的地址(不是isa的值)
(__unsafe_unretained Class *) $7 = 0x0000000100541d80
/// 所謂的內(nèi)存地址,就是他們占用內(nèi)存的第一個(gè)位置
///如對(duì)象p占用內(nèi)存16個(gè)字節(jié)恩溅,是從0x0000000100541d80開始隔箍,0x0000000100541d90結(jié)束,對(duì)象都有固定的長度脚乡,所以只需要記錄開始位置
/// 即 isa內(nèi)存起始位置就是對(duì)象p的起始位置

五蜒滩、總結(jié)

  1. isa的內(nèi)存地址就是對(duì)象的內(nèi)存地址
  2. 實(shí)例對(duì)象的isa的值是類對(duì)象地址
  3. 類對(duì)象的isa的值是元類對(duì)象地址
  4. 元類對(duì)象的isa值是基類的元類對(duì)象地址,基類的元類對(duì)象isa的值是它自己的地址
思考:isa僅僅是保存地址這一個(gè)作用嗎奶稠?64位之后俯艰,優(yōu)化了什么?

isa的作用與內(nèi)部結(jié)構(gòu)(下)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锌订,一起剝皮案震驚了整個(gè)濱河市竹握,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辆飘,老刑警劉巖啦辐,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓传,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芹关,警方通過查閱死者的電腦和手機(jī)续挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侥衬,“玉大人诗祸,你說我怎么就攤上這事≈嶙埽” “怎么了直颅?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肘习。 經(jīng)常有香客問我际乘,道長坡倔,這世上最難降的妖魔是什么漂佩? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮罪塔,結(jié)果婚禮上投蝉,老公的妹妹穿的比我還像新娘。我一直安慰自己征堪,他們只是感情好瘩缆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佃蚜,像睡著了一般庸娱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谐算,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天熟尉,我揣著相機(jī)與錄音,去河邊找鬼洲脂。 笑死斤儿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恐锦。 我是一名探鬼主播往果,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼一铅!你這毒婦竟也來了陕贮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤潘飘,失蹤者是張志新(化名)和其女友劉穎飘蚯,沒想到半個(gè)月后馍迄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡局骤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年攀圈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦甩。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赘来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凯傲,到底是詐尸還是另有隱情犬辰,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布冰单,位于F島的核電站幌缝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诫欠。R本人自食惡果不足惜涵卵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荒叼。 院中可真熱鬧轿偎,春花似錦、人聲如沸被廓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫁乘。三九已至昆婿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜓斧,已是汗流浹背仓蛆。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留法精,地道東北人多律。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像搂蜓,于是被迫代替她去往敵國和親狼荞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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