RunTime第一篇-內存模型

Objective-C是C語言的擴展,讓C具備了面向對象的能力影晓,而且它是一門動態(tài)語言迷守。這都要歸功于runtime犬绒。或者可以說兑凿,Objective-C = C + Runtime;

Runtime的開源是熱更的產(chǎn)生基礎條件凯力,然而蘋果因為“安全因素”又禁止了熱更,JSPatch目前正在努力解決安全問題急膀,從腳本內容RSA加密沮协,到搜索敏感私有接口調用。理論上來講卓嫂,ios應用可以完全依托于JSPatch做開發(fā),就避免了發(fā)版和升級的煩惱聘殖。

內存模型:

Class:

typedef struct objc_class *Class;

struct objc_class {

Class isa; ?//指向meta_class

Class super_class; ? ? //指向父類

const char* name;

long version;

long info;

long instance_size;

struct objc_ivar_list *ivars; //類的成員變量晨雳,使用數(shù)組存儲,使用中基本不變化(只有動態(tài)生成的類才能添加成員變量Ivar)奸腺,存取效率高餐禁。

struct objc_method_list **methodLists; ?//類的成員方法,使用鏈表存儲突照。使用中可能會增加方法帮非,使用鏈表存儲。

struct objc_cache *cache; ? //類的方法緩存。

struct objc_protocol_list *protocols; ?//類遵守的協(xié)議末盔。 ??

};

需要區(qū)分的是筑舅,Class和meta-Class的cache內容不同,Class的cache里面都是實例方法陨舱,meta-Class的cache里面都是類方法翠拣。

Meta-Class

獲取meta-class的方法。

objc_getClass((__bridge void*)[NSObject class])

Class objc_getMetaClass(const char* name) //name: The name of the class to look up

對象

struct objc_object {

Class isa; //指向對象所屬的類游盲。

};

typedef struct objc_object ?*id;

當創(chuàng)建一個特定類的實例對象時误墓,分配的內存包含一個objc_object數(shù)據(jù)結構,然后是類的實例變量的數(shù)據(jù)益缎。

NSObject類的alloc和allocWithZone:方法使用函數(shù)class_createInstance來創(chuàng)建objc_object數(shù)據(jù)結構谜慌。

我們常見的id,它是一個objc_object結構類型的指針莺奔。它的存在可以讓我們實現(xiàn)類似于C++中泛型的一些操作畦娄。該類型的對象可以轉換為任何一種對象,有點類似于C語言中void *指針類型的作用弊仪。C語言中void * 為 “不確定類型指針”熙卡,void *可以用來聲明指針。如:void * a励饵;?

Method

structobjc_method {

SEL method_name; //選擇器

char* method_types;//參數(shù)types是一個描述傳遞給方法的參數(shù)類型的字符數(shù)組驳癌,這涉及到類型編碼。

IMP method_imp; //函數(shù)指針役听。

}

SEL

typedef struct objc_selector *SEL

選擇器颓鲜,用于定位一個方法,可以理解為一個字符串典予。

runtime.h并沒有提供SEL結構體的具體實現(xiàn)甜滨。而只是定義了SEL,typedef struct objc_selector *SEL; 可以這樣理解瘤袖,方法名和SEL之間存在一種映射關系衣摩,理論上SEL是對方法名做一個hash處理。只是猜測捂敌。無論方法名與SEL之間的映射是怎樣的艾扮,它們兩個都是用來區(qū)分一個方法。但是需要注意占婉,runtime官方用來標識一個Method的是Method的SEL泡嘴,而不是方法名。

IMP

typedef id (*IMP) (id,SEL, ...);

可以看出IMP就是一個函數(shù)指針逆济,它的前兩個參數(shù)id代表消息接受者self酌予,SEL代表方法選擇器cmd磺箕。

成員變量

typedef struct objc_ivar * Ivar;

struct objc_ivar {

char* ivar_name;

char* ivar_type;

int ivar_offset;

int space;

}

Property

typedef struct objc_property *objc_property_t;

Category

typedef struct objc_category *Category;

structobjc_category {

char* category_name;

char* class_name;

struct objc_method_list *instance_methods ;

struct objc_method_list *class_methods;

struct objc_protocol_list *protocols;

}

Protocol

typedef struct objc_object Protocol;


一個經(jīng)典的指向圖

isa和superClass的閉環(huán)圖

注意兩個特殊連線:

1,所有元類的isa指針指向的是根類的元類抛虫。

2松靡,根類的元類的父類指向的是根類本身。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末莱褒,一起剝皮案震驚了整個濱河市击困,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌广凸,老刑警劉巖阅茶,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谅海,居然都是意外死亡脸哀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門扭吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撞蜂,“玉大人,你說我怎么就攤上這事侥袜◎蚬睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵枫吧,是天一觀的道長浦旱。 經(jīng)常有香客問我,道長九杂,這世上最難降的妖魔是什么颁湖? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮例隆,結果婚禮上甥捺,老公的妹妹穿的比我還像新娘。我一直安慰自己镀层,他們只是感情好镰禾,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹿响,像睡著了一般羡微。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惶我,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音博投,去河邊找鬼绸贡。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的听怕。 我是一名探鬼主播捧挺,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尿瞭!你這毒婦竟也來了闽烙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤声搁,失蹤者是張志新(化名)和其女友劉穎黑竞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疏旨,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡很魂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了檐涝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏匆。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谁榜,靈堂內的尸體忽然破棺而出幅聘,到底是詐尸還是另有隱情,我是刑警寧澤窃植,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布帝蒿,位于F島的核電站,受9級特大地震影響撕瞧,放射性物質發(fā)生泄漏陵叽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一丛版、第九天 我趴在偏房一處隱蔽的房頂上張望巩掺。 院中可真熱鬧,春花似錦页畦、人聲如沸胖替。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽独令。三九已至,卻和暖如春好芭,著一層夾襖步出監(jiān)牢的瞬間燃箭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工舍败, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留招狸,地道東北人敬拓。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像裙戏,于是被迫代替她去往敵國和親乘凸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉累榜,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,720評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言营勤,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評論 0 7
  • Objective-C語言是一門動態(tài)語言壹罚,他將很多靜態(tài)語言在編譯和鏈接時期做的事情放到了運行時來處理葛作。這種動態(tài)語言...
    tigger丨閱讀 1,404評論 0 8
  • 前言 runtime其實在我們日常開發(fā)過程中很少使用到,尤其是像我現(xiàn)在比較初級的程序猿就更用不到了渔嚷。但是去面試很多...
    WolfTin閱讀 625評論 0 2
  • 本文詳細整理了 Cocoa 的 Runtime 系統(tǒng)的知識进鸠,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 800評論 0 4