isa和superclass

01isa

三種對象在內(nèi)存中的結構,他們之間肯定是有聯(lián)系的


截屏2020-10-19下午8.36.36.png

我們在調(diào)用方法的時候本質(zhì)上是發(fā)消息漆腌,給這個對象發(fā)消息槐沼。而對象方法存在類對象中,類方法存在元類對象中润绵,所以他們之間使用了isa來進行連接

  • instance的isa指向class
    當調(diào)用對象方法時线椰,通過instance的isa找到class,最后找到對象方法的實現(xiàn)進行調(diào)用

  • class的isa指向meta-class
    當調(diào)用類方法時尘盼,通過class的isa找到meta-class憨愉,最后找到類方法的實現(xiàn)進行調(diào)用

02-class的superclass

很重要牽扯到方法調(diào)用,是用來找父類的卿捎,
我們首先創(chuàng)建兩個類Person 和Student配紫,讓他們之間繼承,加上NSObject一共會有3個類對象午阵,

@interface Person:NSObject
@end
@interface Student:Person //16
@end

他們之間的關系


類對象之間的聯(lián)系系

當Student的instance對象要調(diào)用Person的對象方法時躺孝,會先通過isa找到Student的class,然后通過superclass找到Person的class底桂,最后找到對象方法的實現(xiàn)進行調(diào)用

03-meta-class的superclass

元類的superclass之間的關系和作用植袍,Student的元類的superclass指針指向的是Person的元類對象,Person的元類的superclass指針指向的是NSObject的元類對象


元類關系

當Student的class要調(diào)用Person的類方法時戚啥,會先通過isa找到Student的meta-class奋单,然后通過superclass找到Person的meta-class,最后找到類方法的實現(xiàn)進行調(diào)用

04-總結01.

對象之間的isa和superclass之間的關系

instance的isa指向class
class的isa指向meta-class
meta-class的isa指向基類的meta-class

class的superclass指向父類的class
如果沒有父類猫十,superclass指針為nil
meta-class的superclass指向父類的meta-class
基類的meta-class的superclass指向基類的class

  • instance調(diào)用對象方法的軌跡
    isa找到class览濒,方法不存在,就通過superclass找父類

  • class調(diào)用類方法的軌跡
    isa找meta-class拖云,方法不存在贷笛,就通過superclass找父類,如果找到基類的元類也沒有宙项,他回去基類的類對象里面找這個方法乏苦,如果還是沒有,就會報錯 unrecognized selector sent to

05總結02

如果自己的類對象和父類的類對象里面都有test方法尤筐,他會先調(diào)用自己類的方法汇荐,如果自己的類沒有就會調(diào)用父類的方法,如果父類也沒有這個類方法盆繁,但是有對象方法掀淘,那么它也可以調(diào)用成功,因為方法的調(diào)用本質(zhì)就是發(fā)消息objc_senMessage(接受者油昂,@selector(name));他只關心給誰發(fā)送了哪條消息革娄,并不在乎是-或者+開頭的方法

06isa細節(jié)

對象isa里面存的地址值就是他所指向的對象的地址倾贰,從64bit開始 isa需要進行一次位運算,才能計算出真實地址


isa計算方式
# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL

# elif __x86_64__
#   define ISA_MASK        0x00007ffffffffff8ULL
# else
#   error unknown architecture for packed isa
# endif

如果我們想要看一下person的isa的值拦惋, 可以利用lldb調(diào)試工具操作匆浙,經(jīng)過我們自己手動進行isa之間的位運算,法相厕妖,person的isa&isa_mask之后確實得到的就是Person類對象的地址(isa的地址)


isa計算驗證

如果我們想要拿出類對象的isa指針首尼,需要將這個類轉(zhuǎn)成我們自制設計的結構體,因為原來不允許我們訪問言秸,所以根據(jù)我們計算饰恕,類對象和元類的isa也是對應的


類對象的isa和元類的isa

superclass這個指針是不是存在mask運算的,直接可以找到父類類對象的地址


superclass的關系

07class和metaClass的結構

證明類對象里面確實存放了屬性信息井仰,對象方法信息埋嵌,協(xié)議信息
因為類對象都是一種objc_class類型的結構,所以這個結構體里面的信息俱恶,就說我們類對象在內(nèi)存中存放的信息雹嗦,通過我們下載的開源的源碼,搜索objc_class找到新的結構體合是,在objc-runtime-new里面,這個里面的結構體也有繼承了罪,因為他是c++的結構體,他和類沒有區(qū)別,class對象和meta-class對象本質(zhì)上都是struct objc_class類型

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {
        return bits.data();
    }
}
//class_rw_t  rw=readwrite t=table

struct objc_class的結構大致為一下內(nèi)容


objc_class的結構

如果我們想驗證一下是否真的是在內(nèi)存中的結構聪全,我們可以自己模仿他的結構體寫一個我們自己的泊藕,然后把他們的類對象轉(zhuǎn)成我們自己的結構體進一步驗證。
但是如果弄成一樣的太耗時間难礼,而且可能編譯不通過娃圆,所以我們手動改了一些地方;如果我們想編譯c++的文件蛾茉,我們需要把文件后綴改成.mm讼呢。c++的結構體可以不帶struct直接使用

對象的isa指針指向哪里?
instance對象的isa指向class對象
class對象的isa指向meta-class對象
meta-class對象的isa指向基類的meta-class對象

OC的類信息存放在哪里谦炬?
對象方法悦屏、屬性、成員變量键思、協(xié)議信息础爬,存放在class對象中
類方法,存放在meta-class對象中
成員變量的具體值吼鳞,存放在instance對象

8 答疑

類對象和元類對象一直在內(nèi)存中看蚜,知道程序結束才釋放內(nèi)存,當程序一啟動就分配了內(nèi)存赖条。
實例對象里面的成員變量是具體的值失乾,類對象里面的成員變量,是成員變量的信息纬乍。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碱茁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仿贬,更是在濱河造成了極大的恐慌纽竣,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧泪,死亡現(xiàn)場離奇詭異蜓氨,居然都是意外死亡,警方通過查閱死者的電腦和手機队伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門穴吹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗜侮,你說我怎么就攤上這事港令。” “怎么了锈颗?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵顷霹,是天一觀的道長。 經(jīng)常有香客問我击吱,道長淋淀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任覆醇,我火速辦了婚禮朵纷,結果婚禮上,老公的妹妹穿的比我還像新娘永脓。我一直安慰自己柴罐,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布憨奸。 她就那樣靜靜地躺著革屠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪排宰。 梳的紋絲不亂的頭發(fā)上似芝,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音板甘,去河邊找鬼党瓮。 笑死,一個胖子當著我的面吹牛盐类,可吹牛的內(nèi)容都是我干的寞奸。 我是一名探鬼主播呛谜,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枪萄!你這毒婦竟也來了隐岛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓷翻,失蹤者是張志新(化名)和其女友劉穎聚凹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齐帚,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡妒牙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了对妄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湘今。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剪菱,靈堂內(nèi)的尸體忽然破棺而出象浑,到底是詐尸還是另有隱情,我是刑警寧澤琅豆,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布愉豺,位于F島的核電站,受9級特大地震影響茫因,放射性物質(zhì)發(fā)生泄漏蚪拦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一冻押、第九天 我趴在偏房一處隱蔽的房頂上張望驰贷。 院中可真熱鬧,春花似錦洛巢、人聲如沸括袒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锹锰。三九已至,卻和暖如春漓库,著一層夾襖步出監(jiān)牢的瞬間恃慧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工渺蒿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痢士,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓茂装,卻偏偏與公主長得像怠蹂,于是被迫代替她去往敵國和親善延。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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