對(duì)象與isa

對(duì)象本質(zhì)是什么助琐?(結(jié)構(gòu)體)怎么證明呢?
首先了解一下clang,Clang是?個(gè)由Apple主導(dǎo)編寫脊凰,基于LLVM的C/C++/Objective-C編譯器
終端執(zhí)行如下命令

clang -rewrite-objc LGPerson.m -o LGPerson.cpp

打開LGPerson.cpp锻梳,可以看到LGPerson被編譯成了一個(gè)結(jié)構(gòu)體箭券,其中有isa指針

struct LGPerson_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
};

struct NSObject_IMPL {
    Class isa;
};

了解了對(duì)象的本質(zhì)是結(jié)構(gòu)體,那么結(jié)構(gòu)體能被繼承嗎疑枯?通過在xcode中實(shí)際敲代碼發(fā)現(xiàn)報(bào)錯(cuò)所以是不能被繼承的辩块。
但我們可以通過另外一種方式也就是偽繼承的方式實(shí)現(xiàn),如下coding

struct SuperPerson{
    int a;
};

struct SonPerson{ //大小等于a 4個(gè)字節(jié) + b 4個(gè)字節(jié) == 8個(gè)字節(jié)
    struct SuperPerson ll;
    int b;
};

那么如何調(diào)用呢荆永?

 struct SuperPerson pp1;
  pp1.a = 10;
 struct SonPerson pp;
  pp.ll.a = 5;

如上所示我們成功的通過SonPerson訪問了SuperPerson的成員

看到了結(jié)構(gòu)體废亭,再多吧啦點(diǎn),結(jié)構(gòu)體大小是怎樣的呢具钥?在內(nèi)存是什么樣子的呢豆村?

NSLog(@"%lu %lu",sizeof(pp1), sizeof(pp));
2020-09-11 15:54:04.309319+0800 KCObjc[21290:479786] 4 8

isa指針會(huì)用到聯(lián)合體,那么什么是聯(lián)合體骂删,與結(jié)構(gòu)體區(qū)別是啥呢掌动?

結(jié)構(gòu)體占用的內(nèi)存大于等于所有成員占用的內(nèi)存的總和(成員之間可能會(huì)存在縫隙)四啰,共用體占用的內(nèi)存等于最長(zhǎng)的成員占用的內(nèi)存。共用體使用了內(nèi)存覆蓋技術(shù)粗恢,同一時(shí)刻只能保存一個(gè)成員的值拟逮,如果對(duì)新的成員賦值,就會(huì)把原來成員的值覆蓋掉适滓。
coding例子如下

union Person{
    char eye;
    struct{
        char eye_colr;
        BOOL show_eye;
    };
};

調(diào)用如下

 union Person person;
 person.eye = 's';
 person.eye_colr = 's';
 person.show_eye = false;
  NSLog(@"%lu",sizeof(person));
2020-09-11 16:46:48.744520+0800 KCObjc[22164:509122] 2

接下來看看對(duì)象成員isa相關(guān)
通過objc源碼分析可以看到isa初始化過程
[LGPerson alloc]
objc_alloc_init
callAlloc
((id(*)(id, SEL))objc_msgSend)(cls, @selector(alloc));
alloc
_objc_rootAlloc
callAlloc
_objc_rootAllocWithZone
_class_createInstanceFromZone
initInstanceIsa
initIsa
ASSERT(!isTaggedPointer());
isa_t

newisa.bits = ISA_MAGIC_VALUE;
newisa.has_cxx_dtor = hasCxxDtor;
newisa.shiftcls = (uintptr_t)cls >> 3; //uintptr是什么?主要用于指針的按位操作,因?yàn)椴荒軐?duì)指針執(zhí)行按位操作敦迄,為了對(duì)指針執(zhí)行按位操作,需要將指針轉(zhuǎn)換為unitpr類型
 isa = newisa;

p newisa
(isa_t) $7 = {
  cls = LGPerson
  bits = 8303516107940229
   = {
    nonpointer = 1
    has_assoc = 0
    has_cxx_dtor = 1
    shiftcls = 536871984
    magic = 59
    weakly_referenced = 0
    deallocating = 0
    has_sidetable_rc = 0
    extra_rc = 0
  }
}

isa初始化完畢凭迹,再驗(yàn)證

po obj
<LGPerson: 0x10190d0c0>
 x/4gx 0x10190d0c0
0x10190d0c0: 0x001d800100002185 0x0000000000000000
0x10190d0d0: 0x0000000080080000 0x000000010190d371

po 0x001d800100002185 &0x0000000ffffffff8ULL
LGPerson
po 0x001d800100002185
8303516107940229
po 8303516107940229 & 0x0000000ffffffff8ULL
LGPerson

isa獲取流程
object_getClass
getIsa
ISA()
(Class)(isa.bits & ISA_MASK)

p (Class)(isa.bits & 0x00007ffffffffff8ULL)
(Class) $3 = LGPerson
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罚屋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗅绸,更是在濱河造成了極大的恐慌脾猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鱼鸠,死亡現(xiàn)場(chǎng)離奇詭異猛拴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚀狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門愉昆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麻蹋,你說我怎么就攤上這事跛溉。” “怎么了扮授?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵芳室,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我刹勃,道長(zhǎng)堪侯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任荔仁,我火速辦了婚禮伍宦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咕晋。我一直安慰自己雹拄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布掌呜。 她就那樣靜靜地躺著滓玖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪质蕉。 梳的紋絲不亂的頭發(fā)上势篡,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天翩肌,我揣著相機(jī)與錄音,去河邊找鬼禁悠。 笑死念祭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碍侦。 我是一名探鬼主播粱坤,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓷产!你這毒婦竟也來了站玄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤濒旦,失蹤者是張志新(化名)和其女友劉穎株旷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尔邓,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晾剖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梯嗽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齿尽。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慷荔,靈堂內(nèi)的尸體忽然破棺而出雕什,到底是詐尸還是另有隱情缠俺,我是刑警寧澤显晶,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站壹士,受9級(jí)特大地震影響磷雇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躏救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一唯笙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒使,春花似錦崩掘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至英妓,卻和暖如春挽放,著一層夾襖步出監(jiān)牢的瞬間绍赛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工辑畦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吗蚌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓纯出,卻偏偏與公主長(zhǎng)得像蚯妇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子暂筝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350