isa指針

在學(xué)習(xí)KVO時了解到其機理是通過runtime改變isa指針的指向來實現(xiàn)的美澳,但對于isa指針還不是太了解容劳,于是查閱相關(guān)資料在這里做一個整理祟辟。

要了解isa指針首先需要了解類、對象的定義蓖救。
Class:
Object-C類型中類的定義是用Class類型來表示的洪规,實際上它是一個指向objc_class類型的結(jié)構(gòu)體指針,定義如下:

// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;


通過objc.h循捺、runtime.h可以看到類的定義:

// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
//父類斩例,如果該類已經(jīng)是最頂層的根類,那么它為NULL。
Class super_class OBJC2_UNAVAILABLE;
//類名
const char *name OBJC2_UNAVAILABLE;
//類的版本信息,默認(rèn)為0
long version OBJC2_UNAVAILABLE;
//類信息巨柒,供運行期使用的一些位標(biāo)識
long info OBJC2_UNAVAILABLE;
//該類的實例變量大小
long instance_size OBJC2_UNAVAILABLE;
//該類的成員變量鏈表
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
//方法定義的鏈表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
//方法緩存
struct objc_cache *cache OBJC2_UNAVAILABLE;
//協(xié)議鏈表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

其中:

  • isa:在OC中需要明確對象和類并沒有本質(zhì)的區(qū)別樱拴,類也是對象,類中有一個指向元類metaClass的isa指針洋满,關(guān)于元類會在后邊進行介紹。

  • cashe:當(dāng)一個對象接收到某個消息時珍坊,它會根據(jù)isa指針去查找能夠響應(yīng)消息的對象牺勾,每次調(diào)用這個方法后就會緩存到cache中而不必每次都到methodLists遍歷。

objc_object與id:
objc_object表示一個對象阵漏,實際上它表示一個類實例的結(jié)構(gòu)體驻民,定義如下:

struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};

typedef struct objc_object *id;

可以看到荠呐,對象中包含一個指向其類的isa指針慰毅。當(dāng)我們向一個對象發(fā)送消息時耕姊,Runtime會根據(jù)實例對象的isa指針找到這個實例對象所屬的類白胀,Runtime庫會在類的方法列表及父類的方法列表中去尋找與消息對應(yīng)的selector指向的方法鳄橘。找到后即運行這個方法情臭。

元類(Meta Class):
前面已經(jīng)提到類也是對象飒货,當(dāng)向?qū)ο蟀l(fā)送消息的時會根據(jù)對象isa指針查找所屬類的對應(yīng)方法总棵,對于類方法而言呢,它應(yīng)該去哪查找方法蝗柔?如:

NSString *string = [NSString string];

根據(jù)前面提到的機制闻葵,此時要查找相應(yīng)類對象的+string方法則isa指針需要查找包含這個方法的類,即元類metaClass:類對象所屬的類癣丧。當(dāng)我們向一個對象發(fā)送消息時槽畔,runtime會在這個對象所屬的這個類的方法列表中查找方法;而向一個類發(fā)送消息時胁编,會在這個類的元類的方法列表中查找厢钧。

元類也是一個類,也可以向它發(fā)送一個消息嬉橙,那么它的isa又是指向什么呢坏快?為了不讓這種結(jié)構(gòu)無限延伸下去,Objective-C的設(shè)計者讓所有的元類的isa指向基類的元類憎夷,以此作為它們的所屬類莽鸿。即,任何NSObject繼承體系下的元類都使用NSObject的元類作為自己的所屬類拾给,而基類的元類的isa指針是指向它自己祥得。這樣就形成了一個完美的閉環(huán)。

通過上面的描述蒋得,我們就可以描繪出類的一個繼承體系了级及,如下圖所示:


類的繼承體系圖

PS: I am xinghun who is on the road.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市额衙,隨后出現(xiàn)的幾起案子饮焦,更是在濱河造成了極大的恐慌,老刑警劉巖窍侧,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件县踢,死亡現(xiàn)場離奇詭異,居然都是意外死亡伟件,警方通過查閱死者的電腦和手機硼啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斧账,“玉大人谴返,你說我怎么就攤上這事∵种” “怎么了嗓袱?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長习绢。 經(jīng)常有香客問我渠抹,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任逼肯,我火速辦了婚禮耸黑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮幢。我一直安慰自己大刊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布三椿。 她就那樣靜靜地躺著缺菌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搜锰。 梳的紋絲不亂的頭發(fā)上伴郁,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音蛋叼,去河邊找鬼焊傅。 笑死,一個胖子當(dāng)著我的面吹牛狈涮,可吹牛的內(nèi)容都是我干的狐胎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歌馍,長吁一口氣:“原來是場噩夢啊……” “哼握巢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起松却,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤暴浦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晓锻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歌焦,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年带射,在試婚紗的時候發(fā)現(xiàn)自己被綠了同规。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窟社,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绪钥,到底是詐尸還是另有隱情灿里,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布程腹,位于F島的核電站匣吊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜色鸳,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一社痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧命雀,春花似錦蒜哀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狐血,卻和暖如春淀歇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匈织。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工浪默, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缀匕。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓纳决,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弦追。 傳聞我的和親對象是個殘疾皇子岳链,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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