ios - objectC 的isa 詳解

一.isa指針

要認(rèn)識(shí)什么是isa指針译荞,我們得先明確一點(diǎn):

在Objective-C中,任何類的定義都是對(duì)象。類和類的實(shí)例(對(duì)象)沒有任何本質(zhì)上的區(qū)別。任何對(duì)象都有isa指針茫死。

那么什么是類呢?在xcode中用快捷鍵Shift+Cmd+O 打開文件objc.h 能看到類的定義:


可以看出:

Class 是一個(gè) objc_class 結(jié)構(gòu)類型的指針, id是一個(gè) objc_object 結(jié)構(gòu)類型的指針.

我們再來看看 objc_class 的定義:


稍微解釋一下各個(gè)參數(shù)的意思:

isa:【***Object-C對(duì)類對(duì)象與實(shí)例對(duì)象中的 isa 所指向的類結(jié)構(gòu)作了不同的命名:類對(duì)象中的 isa 指向類結(jié)構(gòu)被稱作 metaclass履羞,metaclass 存儲(chǔ)類的static類成員變量與static類成員方法(+開頭的方法)峦萎;實(shí)例對(duì)象中的 isa 指向類結(jié)構(gòu)稱作 class(普通的),class 結(jié)構(gòu)存儲(chǔ)類的普通成員變量與普通成員方法(-開頭的方法)忆首。***】是一個(gè)Class 類型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念惏疲鳦lass里也有個(gè)isa的指針, 指向meteClass(元類)。元類保存了類方法的列表糙及。當(dāng)類方法被調(diào)用時(shí)详幽,先會(huì)從本身查找類方法的實(shí)現(xiàn),如果沒有浸锨,元類會(huì)向他父類查找該方法唇聘。同時(shí)注意的是:元類(meteClass)也是類,它也是對(duì)象柱搜。元類也有isa指針,它的isa指針最終指向的是一個(gè)根元類(root meteClass).根元類的isa指針指向本身迟郎,這樣形成了一個(gè)封閉的內(nèi)循環(huán)。

super_class:父類聪蘸,如果該類已經(jīng)是最頂層的根類,那么它為NULL谎亩。

version:類的版本信息,默認(rèn)為0

info:供運(yùn)行期使用的一些位標(biāo)識(shí)。

instance_size:該類的實(shí)例變量大小

ivars:成員變量的數(shù)組

再來看看各個(gè)類實(shí)例變量的繼承關(guān)系:


每一個(gè)對(duì)象本質(zhì)上都是一個(gè)類的實(shí)例宇姚。其中類定義了成員變量和成員方法的列表匈庭。對(duì)象通過對(duì)象的isa指針指向類。

每一個(gè)類本質(zhì)上都是一個(gè)對(duì)象浑劳,類其實(shí)是元類(meteClass)的實(shí)例阱持。元類定義了類方法的列表。類通過類的isa指針指向元類魔熏。

所有的元類最終繼承一個(gè)根元類衷咽,根元類isa指針指向本身鸽扁,形成一個(gè)封閉的內(nèi)循環(huán)。

二.runtime 機(jī)制

runtime:指一個(gè)程序在運(yùn)行(或者在被執(zhí)行)的狀態(tài)镶骗。也就是說桶现,當(dāng)你打開一個(gè)程序使它在電腦上運(yùn)行的時(shí)候,那個(gè)程序就是處于運(yùn)行時(shí)刻鼎姊。在一些編程語言中骡和,把某些可以重用的程序或者實(shí)例打包或者重建成為“運(yùn)行庫"。這些實(shí)例可以在它們運(yùn)行的時(shí)候被連接或者被任何程序調(diào)用相寇。

objective-c中runtime:是一套比較底層的純C語言API, 屬于1個(gè)C語言庫, 包含了很多底層的C語言API慰于。 在我們平時(shí)編寫的OC代碼中, 程序運(yùn)行過程時(shí), 其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼。

runtime的應(yīng)用:

1.動(dòng)態(tài)創(chuàng)建一個(gè)類(比如KVO的底層實(shí)現(xiàn))

2.動(dòng)態(tài)地為某個(gè)類添加屬性\方法, 修改屬性值\方法

3.遍歷一個(gè)類的所有成員變量(屬性)\所有方法

實(shí)質(zhì)上唤衫,以上的是通過相關(guān)方法來獲取對(duì)象或者類的isa指針來實(shí)現(xiàn)的婆赠。

相關(guān)函數(shù)

1.? 增加

增加函數(shù):class_addMethod

增加實(shí)例變量:class_addIvar

增加屬性:@dynamic標(biāo)簽,或者class_addMethod佳励,因?yàn)閷傩云鋵?shí)就是由getter和setter函數(shù)組成

增加Protocol:class_addProtocol (說實(shí)話我真不知道動(dòng)態(tài)增加一個(gè)protocol有什么用,-_-!!)

2.? 獲取

獲取函數(shù)列表及每個(gè)函數(shù)的信息(函數(shù)指針休里、函數(shù)名等等):class_getClassMethod method_getName ...

獲取屬性列表及每個(gè)屬性的信息:class_copyPropertyList property_getName

獲取類本身的信息,如類名等:class_getName class_getInstanceSize

獲取變量列表及變量信息:class_copyIvarList

獲取變量的值

3.? ? 替換

將實(shí)例替換成另一個(gè)類:object_setClass

替換類方法的定義:class_replaceMethod

4.其他常用方法:

交換兩個(gè)方法的實(shí)現(xiàn):method_exchangeImplementations.

設(shè)置一個(gè)方法的實(shí)現(xiàn):method_setImplementation.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赃承,隨后出現(xiàn)的幾起案子份帐,更是在濱河造成了極大的恐慌,老刑警劉巖楣导,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畜挨,居然都是意外死亡筒繁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門巴元,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡咏,“玉大人,你說我怎么就攤上這事逮刨∨荤裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵修己,是天一觀的道長恢总。 經(jīng)常有香客問我,道長睬愤,這世上最難降的妖魔是什么片仿? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮尤辱,結(jié)果婚禮上砂豌,老公的妹妹穿的比我還像新娘厢岂。我一直安慰自己,他們只是感情好阳距,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布塔粒。 她就那樣靜靜地躺著,像睡著了一般筐摘。 火紅的嫁衣襯著肌膚如雪卒茬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天蓄拣,我揣著相機(jī)與錄音扬虚,去河邊找鬼。 笑死球恤,一個(gè)胖子當(dāng)著我的面吹牛辜昵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咽斧,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堪置,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了张惹?” 一聲冷哼從身側(cè)響起舀锨,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宛逗,沒想到半個(gè)月后坎匿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷激,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年替蔬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屎暇。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡承桥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出根悼,到底是詐尸還是另有隱情凶异,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布挤巡,位于F島的核電站剩彬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矿卑。R本人自食惡果不足惜襟衰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瀑晒,春花似錦绍坝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玖详,卻和暖如春把介,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟋座。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工拗踢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人向臀。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓巢墅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親券膀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子君纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • 首先說明,這篇文章幾乎都是抄錄的別人的博客芹彬,簡書文章蓄髓,在此總結(jié),只是為了方便記憶和以后閱讀舒帮,如果有什么失禮的地方会喝,...
    LiYaoPeng閱讀 4,947評(píng)論 1 14
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,135評(píng)論 0 9
  • 入駐簡書也大半年 ,一直以來都很喜歡這個(gè)APP玩郊,因?yàn)槲矣X得人生那么長肢执,是需要用文字來記錄的,自己每一次的成長瓦宜,自...
    雅俗不共賞閱讀 437評(píng)論 2 2
  • 暮云換來黃昏,忍留聲岭妖。 怎教一江明月食蒼穹临庇。 流星淚,露初華昵慌,一時(shí)同假夺。。 自是逝去遠(yuǎn)勝留世名斋攀。 我想到了用這個(gè)方法...
    田曰天閱讀 247評(píng)論 28 8
  • 等穆塵一走已卷,歐陽陷入思想和情感的困境中。嘉禾知道淳蔼,這個(gè)時(shí)候除了安靜的坐著不適合做任何事情侧蘸,不適合說任何一句話裁眯。哪怕...
    疏影梅花閱讀 396評(píng)論 0 4