iOS - ISA

id是指向一個類的實(shí)例對象的指針欢瞪。

/// A pointer to an instance of a class.
typedef struct objc_object *id;

類的底層定義

typedef struct objc_class *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();
    }
    //……
}

對象的底層定義,類繼承自objc_object吃挑,所以類也是對象,類對象街立。
ISA() assumes this is NOT a tagged pointer object假設(shè)這不是tagged pointer object舶衬,因?yàn)?a href="http://www.reibang.com/p/466e63a008ff" target="_blank">TaggedPointer沒有isa指針

struct objc_object {
private:
    isa_t isa;

public:
    // ISA() assumes this is NOT a tagged pointer object
    Class ISA();

    // rawISA() assumes this is NOT a tagged pointer object or a non pointer ISA
    Class rawISA();

    // getIsa() allows this to be a tagged pointer object
    Class getIsa();

    //……
}

OC對象的本質(zhì),每個OC對象都含有一個isa指針赎离,64位之前逛犹,isa僅僅是一個指針,保存著對象或類對象內(nèi)存地址梁剔,在64位架構(gòu)之后虽画,apple對isa進(jìn)行了優(yōu)化,叫做nonpointer_isa荣病,變成了一個共用體(union)結(jié)構(gòu)码撰,同時使用位域來存儲更多的信息。

union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls;
    uintptr_t bits;
#if defined(ISA_BITFIELD)
    struct {
        //ISA_BITFIELD;  // defined in isa.h
# if __arm64__
        //表示是否對isa開啟指針優(yōu)化 个盆。0代表是純isa指針脖岛,1代表除了地址外,還包含了類的一些信息颊亮、對象的引用計(jì)數(shù)等柴梆。
        uintptr_t nonpointer        : 1;                                       \
        //是否有關(guān)聯(lián)對象
        uintptr_t has_assoc         : 1;                                       \
        //是否有C++或Objc的析構(gòu)器,如果有析構(gòu)函數(shù)编兄,則需要做一些析構(gòu)的邏輯處理轩性,如果沒有,則可以更快的釋放對象
        uintptr_t has_cxx_dtor      : 1;                                       \
        //存儲類指針的值狠鸳,開啟指針優(yōu)化的情況下揣苏,arm64位中有33位來存儲類的指針。
        uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
        //判斷當(dāng)前對象是真的對象還是一段沒有初始化的空間
        uintptr_t magic             : 6;                                       \
        //是否有被弱引用件舵,沒有弱引用的對象釋放的更快
        uintptr_t weakly_referenced : 1;                                       \
        //是否正在釋放
        uintptr_t deallocating      : 1;                                       \
        //是否有使用SideTable進(jìn)行引用計(jì)數(shù)
        uintptr_t has_sidetable_rc  : 1;                                       \
        //表示該對象的引用計(jì)數(shù)值卸察,實(shí)際上是引用計(jì)數(shù)減一。
        uintptr_t extra_rc          : 19
# elif __x86_64__
        uintptr_t nonpointer        : 1;                                         \
        uintptr_t has_assoc         : 1;                                         \
        uintptr_t has_cxx_dtor      : 1;                                         \
        uintptr_t shiftcls          : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
        uintptr_t magic             : 6;                                         \
        uintptr_t weakly_referenced : 1;                                         \
        uintptr_t deallocating      : 1;                                         \
        uintptr_t has_sidetable_rc  : 1;                                         \
        uintptr_t extra_rc          : 8
# endif

    };
#endif
};
ISA指向結(jié)構(gòu)圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铅祸,一起剝皮案震驚了整個濱河市坑质,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌临梗,老刑警劉巖涡扼,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盟庞,居然都是意外死亡吃沪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門什猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來票彪,“玉大人红淡,你說我怎么就攤上這事〗抵” “怎么了在旱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長推掸。 經(jīng)常有香客問我桶蝎,道長,這世上最難降的妖魔是什么谅畅? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任俊嗽,我火速辦了婚禮,結(jié)果婚禮上铃彰,老公的妹妹穿的比我還像新娘。我一直安慰自己芯咧,他們只是感情好牙捉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敬飒,像睡著了一般邪铲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上无拗,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天带到,我揣著相機(jī)與錄音,去河邊找鬼英染。 笑死揽惹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的四康。 我是一名探鬼主播搪搏,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闪金!你這毒婦竟也來了疯溺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤哎垦,失蹤者是張志新(化名)和其女友劉穎囱嫩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漏设,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墨闲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愿题。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损俭。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛙奖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杆兵,到底是詐尸還是另有隱情雁仲,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布琐脏,位于F島的核電站攒砖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏日裙。R本人自食惡果不足惜吹艇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昂拂。 院中可真熱鬧受神,春花似錦、人聲如沸格侯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽联四。三九已至撑碴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朝墩,已是汗流浹背醉拓。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留收苏,地道東北人亿卤。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鹿霸,于是被迫代替她去往敵國和親怠噪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348