iOS底層:探究Objective-C和OC對象的本質(zhì)


Objective-C的本質(zhì)

我們平時編寫的Objective-C代碼,底層實現(xiàn)其實都是C\C++代碼力惯,所以Objective-C的面向?qū)ο蠖际腔贑\C++的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的熏矿。

語言轉(zhuǎn)換流程
Objective-C的對象响巢、類主要是基于C\C++的結(jié)構(gòu)體實現(xiàn)的见妒。

如何將Objective-C代碼轉(zhuǎn)換為C\C++代碼供搀?

//如果需要鏈接其他框架鞋囊,使用-framework參數(shù)止后。比如-framework UIKit
xcrun  -sdk  iphoneos  clang  -arch  arm64  -rewrite-objc  OC源文件  -o  輸出的CPP文件

OC對象的本質(zhì)

NSObject的底層實現(xiàn)
NSObject對象

為了方便理解所以直接寫Class類,其實是個結(jié)構(gòu)體:
struct NSObject_IMPL NSObject_IVARS

如何實時查看內(nèi)存數(shù)據(jù)

Debug -> Debug Workfllow -> View Memory (Shift + Command + M)
Xcode

OC對象的分類

1溜腐、instance對象(實例對象)

instance對象就是通過類alloc出來的對象译株,每次調(diào)用alloc都會產(chǎn)生新的instance對象。

NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
兩個對象內(nèi)存地址

object1挺益、object2是NSObject的instance對象(實例對象),它們是不同的兩個對象歉糜,分別占據(jù)著兩塊不同的內(nèi)存。

instance對象在內(nèi)存中存儲的信息包括:isa指針其他成員變量望众。

2匪补、class對象(類對象)

NSObject *object1 = [[NSObject alloc] init];
Class objectClass1 = [object1 class];
Class objectClass2 = object_getClass(object1); //Runtime API

objectClass1和objectClass2都是NSObject的class對象(類對象),每個類在內(nèi)存中有且只有一個class對象。

class對象在內(nèi)存中存儲的信息主要包括:isa指針烂翰、superclass指針夯缺、類的屬性信息(@property)、類的對象方法信息(instance method)甘耿、類的協(xié)議信息(protocol)踊兜、類的成員變量信息(ivar)

類對象存儲內(nèi)容

3、meta-class對象(元類對象)

Class objectMetaClass = object_getClass([NSObject class]); //Runtime API

objectMetaClass是NSObject的meta-class對象(元類對象),每個類在內(nèi)存中有且只有一個meta-class對象棵里。

class對象在內(nèi)存中存儲的信息主要包括:isa指針润文、superclass指針、類的類方法信息(class method)

元類對象存儲內(nèi)容

查看Class是否為meta-class

isa殿怜、superclass總結(jié)

1典蝌、instance的isa指向class
2、class的isa指向meta-class
3头谜、meta-class的isa指向基類的meta-class
4骏掀、class的superclass指向父類的class,如果沒有父類,superclass指針為nil
5截驮、meta-class的superclass指向父類的meta-class笑陈,基類的meta-class的superclass指向基類的class
6、instance調(diào)用對象方法的軌跡:isa找到class葵袭,方法不存在涵妥,就通過superclass找父類
7、class調(diào)用類方法的軌跡:isa找meta-class坡锡,方法不存在蓬网,就通過superclass找父類

總結(jié)圖

從64bit開始,isa需要進行一次位運算鹉勒,才能計算出真實地址

窺探struct objc_class的結(jié)構(gòu)

class帆锋、meta-class對象的本質(zhì)結(jié)構(gòu)都是struct objc_class

struct objc_class

class_rw_t

class_rw_t里面的methods、properties禽额、protocols是二維數(shù)組锯厢,是可讀可寫的,包含了類的初始內(nèi)容脯倒、分類的內(nèi)容实辑。

class_rw_t

class_ro_t

class_ro_t里面的baseMethodList、baseProtocols盔憨、ivars徙菠、baseProperties是一維數(shù)組,是只讀的郁岩,包含了類的初始內(nèi)容婿奔。

class_ro_t

method_t

method_t是對方法\函數(shù)的封裝。

method_t

IMP代表函數(shù)的具體實現(xiàn)问慎。
IMP

SEL代表方法\函數(shù)名萍摊,一般叫做選擇器,底層結(jié)構(gòu)跟char *類似如叼。

可以通過@selector()和sel_registerName()獲得冰木。
可以通過sel_getName()和NSStringFromSelector()轉(zhuǎn)成字符串。
不同類中相同名字的方法笼恰,所對應的方法選擇器是相同的踊沸。

SEL

types包含了函數(shù)返回值、參數(shù)編碼的字符社证。
types
iOS中提供了一個叫做@encode的指令逼龟,可以將具體的類型表示成字符串編碼
code表

方法緩存

Class內(nèi)部結(jié)構(gòu)中有個方法緩存(cache_t),用散列表(哈希表)來緩存曾經(jīng)調(diào)用過的方法追葡,可以提高方法的查找速度腺律。

cache_t

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奕短,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匀钧,更是在濱河造成了極大的恐慌翎碑,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件之斯,死亡現(xiàn)場離奇詭異日杈,居然都是意外死亡,警方通過查閱死者的電腦和手機吊圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門达椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翰蠢,“玉大人项乒,你說我怎么就攤上這事×翰祝” “怎么了檀何?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長廷支。 經(jīng)常有香客問我频鉴,道長,這世上最難降的妖魔是什么恋拍? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任垛孔,我火速辦了婚禮,結(jié)果婚禮上施敢,老公的妹妹穿的比我還像新娘周荐。我一直安慰自己,他們只是感情好僵娃,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布概作。 她就那樣靜靜地躺著,像睡著了一般默怨。 火紅的嫁衣襯著肌膚如雪讯榕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天匙睹,我揣著相機與錄音愚屁,去河邊找鬼。 笑死痕檬,一個胖子當著我的面吹牛霎槐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谆棺,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼栽燕,長吁一口氣:“原來是場噩夢啊……” “哼罕袋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碍岔,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤浴讯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔼啦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榆纽,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年捏肢,在試婚紗的時候發(fā)現(xiàn)自己被綠了奈籽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸵赫,死狀恐怖衣屏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辩棒,我是刑警寧澤狼忱,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站一睁,受9級特大地震影響钻弄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜者吁,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一窘俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧复凳,春花似錦瘤泪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至单鹿,卻和暖如春掀宋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仲锄。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工劲妙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儒喊。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓镣奋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怀愧。 傳聞我的和親對象是個殘疾皇子侨颈,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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