Runtime-術(shù)語與數(shù)據(jù)結(jié)構(gòu)

Runtime-術(shù)語與數(shù)據(jù)結(jié)構(gòu)

  • RunTime簡稱運行時翎冲,它純C語言API

  • OC的函數(shù)調(diào)用為消息發(fā)送:為動態(tài)調(diào)用過程簸州,編譯時缠借,有聲明函數(shù),就不報錯跳夭,運行時根據(jù)函數(shù)名稱找到對應(yīng)實現(xiàn)

  • C語言的區(qū)別:C語言是編譯時決定調(diào)用哪個函數(shù)

1涂圆、SEL

描述

  • 它是selector在 Objc 中的表示(Swift 中是 Selector 類)
  • selector 對方法名進(jìn)行包裝,以便找到對應(yīng)的方法實現(xiàn)
  • 編譯時根據(jù)方法名币叹,參數(shù)序列生成的唯一標(biāo)示

定義

typedef struct objc_selector    *SEL; // 映射到方法的 C 字符串

內(nèi)部實現(xiàn)(猜想)

struct objc_selector  {
char name[64 or ...];
...
};

特性

  • 作為IMP的key,存儲在NSSet中
  • OC中同一類不能有同名的SEL润歉,原因在上
  • 不同類可以有相同的方法名:因為class各種對應(yīng)自己的方法列表

用法

  • Objc 編譯器器命令@selector(): SEL selector = @selector(description);
  • Runtime函數(shù): SEL selector2 = sel_registerName("description");

2、id

描述

  • 參數(shù)類型颈抚,指向某個類實例的指針

定義

typedef struct objc_object *id;

內(nèi)部實現(xiàn)

struct objc_object { Class isa; }; // isa找到所屬類

特性

  • isa踩衩,不總指向真實所屬類
  • 調(diào)用-class 方法確定真實類
  • KVOisa指向了中間類

用法

3、Class

描述

  • 指向 objc_class 結(jié)構(gòu)體的指針

定義

typedef struct objc_class *Class;

內(nèi)部實現(xiàn)

struct objc_class {
Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class      // 父類
const char *name    // 類名
long version       // 類的版本信息贩汉,默認(rèn)為0
long info          // 類信息九妈,供運行期使用的一些位標(biāo)識
long instance_size                              // 類的實例變量大小
struct objc_ivar_list *ivars                    // 類的成員變量鏈表
struct objc_method_list **methodLists    // 方法定義的鏈表
struct objc_cache *cache                   // 方法緩存
struct objc_protocol_list *protocols    // 協(xié)議鏈表
#endif
} OBJC2_UNAVAILABLE;


特性

  • 存儲元類及父類指針
  • 存儲 方法,實例雾鬼,協(xié)議鏈表
  • 存儲方法緩存、類名宴树,版本等信息策菜。

用法

  • 可根據(jù)isa找到Class,進(jìn)而進(jìn)行方法調(diào)用等操作

4、Method

描述

  • Method 代表類中某個方法的類型

定義

typedef struct objc_method *Method;

內(nèi)部實現(xiàn)

typedef struct objc_method *Method;
struct objc_method {
SEL method_name      ;  // 方法名
char *method_types    ; // 參數(shù)類型
IMP method_imp         ;  // 方法實現(xiàn)
}

特性

  • 運行時才將SEL和IMP綁定, 動態(tài)配置方法
  • 通過SEL可找到對應(yīng)的IMP實現(xiàn)

5又憨、IMP

描述

  • 它是編譯器生成的函數(shù)指針

定義

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

特性

  • IMP指針指向了方法的實現(xiàn)
  • 通過SEL取得IMP后翠霍,得到方法進(jìn)行調(diào)用

6、Ivar

描述

  • 表示成員變量的類型

定義

typedef struct objc_ivar *Ivar;

內(nèi)部實現(xiàn)

struct objc_ivar {
    char *ivar_name OBJC2_UNAVAILABLE; // 變量名蠢莺。
    char *ivar_type OBJC2_UNAVAILABLE; // 變量類型寒匙。
    int ivar_offset OBJC2_UNAVAILABLE; // 基地址偏移量,在對成員變量尋址時使用躏将。
#ifdef __LP64__
    int space OBJC2_UNAVAILABLE;
#endif
}

7锄弱、Property

描述

  • 表示屬性

定義

typedef struct objc_property *Property;
typedef struct objc_property *objc_property_t;//這個更常用

用法

  • 獲取類屬性:objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
  • 獲取協(xié)議屬性:objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)

8、Cache

描述

  • 方法緩存

定義

typedef struct objc_cache *Cache

內(nèi)部結(jié)構(gòu)

struct objc_cache {
// 緩存bucket的總數(shù)
unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
// 實際緩存bucket的總數(shù)
unsigned int occupied  OBJC2_UNAVAILABLE;
// 指向Method數(shù)據(jù)結(jié)構(gòu)指針的數(shù)組
Method buckets[1]                                        OBJC2_UNAVAILABLE;
};

特性

  • 方法調(diào)用先在緩存中找
  • 方法調(diào)用存進(jìn)緩存池祸憋,方便下次調(diào)用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末会宪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚯窥,更是在濱河造成了極大的恐慌掸鹅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦赠,死亡現(xiàn)場離奇詭異巍沙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荷鼠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門句携,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颊咬,你說我怎么就攤上這事务甥。” “怎么了喳篇?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵敞临,是天一觀的道長。 經(jīng)常有香客問我麸澜,道長挺尿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任炊邦,我火速辦了婚禮编矾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馁害。我一直安慰自己窄俏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布碘菜。 她就那樣靜靜地躺著凹蜈,像睡著了一般限寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仰坦,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天履植,我揣著相機(jī)與錄音,去河邊找鬼悄晃。 笑死玫霎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妈橄。 我是一名探鬼主播庶近,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眷细!你這毒婦竟也來了拦盹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤溪椎,失蹤者是張志新(化名)和其女友劉穎普舆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體校读,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡沼侣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉秫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛾洛。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雁芙,靈堂內(nèi)的尸體忽然破棺而出轧膘,到底是詐尸還是另有隱情,我是刑警寧澤兔甘,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布谎碍,位于F島的核電站,受9級特大地震影響洞焙,放射性物質(zhì)發(fā)生泄漏蟆淀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一澡匪、第九天 我趴在偏房一處隱蔽的房頂上張望熔任。 院中可真熱鬧,春花似錦唁情、人聲如沸疑苔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夯巷。三九已至赛惩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁餐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工篮绰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留后雷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓吠各,卻偏偏與公主長得像臀突,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贾漏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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