iOS 底層 - runtime 之 Class的結構 -->方法和簽名

本文源自本人的學習記錄整理與理解掸屡,其中參考閱讀了部分優(yōu)秀的博客和書籍,盡量以通俗簡單的語句轉述仅财。引用到的地方如有遺漏或未能一一列舉原文出處還望見諒與指出,另文章內容如有不妥之處還望指教盏求,萬分感謝 !

對于Class的結構的認識

class結構.png

class_rw_t

class_rw_t@2x.png

class_ro_t

class_ro_t@2x.png

class_ro_t中的baseMethodList是一維數組

method_t

method_t 是對方法/函數的封裝;我們每編寫一個方法最終都被封裝成了method_t這種結構荆烈;

簡化(去掉方法定義,保留屬性)過的源碼

struct method_t{
SEL name;                //函數名/方法名
const char *types;  //編碼(返回值類型憔购、參數類型)
IMP imp;                   //指向函數的指針(指針中存儲函數地址)
}
method_t@2x.png

SEL 代表方法/函數名,一般叫做選擇器玫鸟,底層結構跟char*類似;

typedef struct objc_selector  *SEL

可以通過@selector()和sel_registerName()獲得
可以通過selgetName()和NSStringFromSelector()轉成字符串
不同類中相同名字的方法,所對應的方法選擇器是相同的,地址值一樣妥曲;


SEL sel1 = sel-registerName("test")
SEL sel2 = @selector(test);

char  *selStr =  sel_getName(sel1);

NSString  *selStr = NSStringFromSelector(sel2);

types 是包含了函數返回值、參數編碼的字符串檐盟;
如 :"v14@0:9"褂萧,字符串內容是用@encode(編碼技術)指令表示箱玷,可以將具體的類型表示成字符串編碼
示例注解:
v --> 返回值類型 14 所有參數所占字節(jié)數
@ --> 第一個參數 0代表從第0個字節(jié)開始,如果是8就表示從第8個字節(jié)開始
: --> SEL 類型 锡足、 _cmd

iOS中提供了一個叫做@encode的指令壳坪,可以將具體的類型表示成字符串編碼

  • @encode實際上是編譯器指令其中的一種
  • @encode能夠返回一個Objective-C 類型編碼(Objective-C Type Encodings)
  • @encode是一種編譯器內部表示的字符串舶得,方便識別,類似于 ANSI C 的 typeof 操作
    在Objective-C中爽蝴,用@encode指令的方式來表示沐批,可以方便Runtime內部利用類型編碼幫助加快消息分發(fā)

常用的@encode指令:

encode1.png
encode2.png

IMP是指向函數的指針(存儲了所指向函數的地址),代表函數的具體實現


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

  1. OC方法三要素是什么 蝎亚?

答:SEL (函數名/方法名) 九孩、types (編碼(返回值類型、參數類型))发框、IMP(指向函數的指針(函數地址))

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末躺彬,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子梅惯,更是在濱河造成了極大的恐慌宪拥,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铣减,死亡現場離奇詭異,居然都是意外死亡缔刹,警方通過查閱死者的電腦和手機劣针,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門酿秸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辣苏,“玉大人,你說我怎么就攤上這事稀蟋。” “怎么了退客?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵萌狂,是天一觀的道長。 經常有香客問我误趴,道長务傲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任看杭,我火速辦了婚禮挟伙,結果婚禮上,老公的妹妹穿的比我還像新娘烘豹。我一直安慰自己诺祸,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布憔鬼。 她就那樣靜靜地躺著胃夏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪照雁。 梳的紋絲不亂的頭發(fā)上答恶,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天萍诱,我揣著相機與錄音裕坊,去河邊找鬼燕酷。 笑死,一個胖子當著我的面吹牛苗缩,可吹牛的內容都是我干的。 我是一名探鬼主播苹享,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼得问,長吁一口氣:“原來是場噩夢啊……” “哼软免!你這毒婦竟也來了?” 一聲冷哼從身側響起漓骚,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤榛泛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孤个,有當地人在樹林里發(fā)現了一具尸體沛简,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年给郊,在試婚紗的時候發(fā)現自己被綠了淆九。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡跪另,死狀恐怖煤搜,靈堂內的尸體忽然破棺而出唧席,到底是詐尸還是另有隱情,我是刑警寧澤迹卢,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布腐碱,位于F島的核電站,受9級特大地震影響症见,放射性物質發(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

推薦閱讀更多精彩內容