1. 什么是運(yùn)行時(shí)? <objc/message.h>/ <objc/runtime>
1>運(yùn)行時(shí)是一套純 C 語言的 API(純 C 語言庫)
2>*編譯器最終都會(huì)將 OC 代碼轉(zhuǎn)化為運(yùn)行時(shí)代碼.
*clang -rewrite-objc xxx.m編譯器指令驗(yàn)證編譯器將 OC代碼轉(zhuǎn)換成運(yùn)行時(shí)代碼
3>利用運(yùn)行時(shí), 可以做很多底層的操作, 比如
*動(dòng)態(tài)添加成員變量和方法
*動(dòng)態(tài)交換兩個(gè)方法的實(shí)現(xiàn)
*獲得某個(gè)類的所有成員方法, 所有成員變量
例: 動(dòng)態(tài)交換方法:
a.png
b.png
c.png
2. 如何應(yīng)用運(yùn)行時(shí)
1> 將某些 OC 代碼轉(zhuǎn)為運(yùn)行時(shí), 探究底層. 比如 block 的實(shí)現(xiàn)原理
2> 攔截系統(tǒng)自帶的方法調(diào)用, 比如攔截 imageNamed:, viewDidLoad, alloc
3> 實(shí)現(xiàn)字典和模型的自動(dòng)轉(zhuǎn)換
4> 實(shí)現(xiàn)分類也可以增加屬性
5>實(shí)現(xiàn) NSCoding 屬性的自動(dòng)歸檔和自動(dòng)解檔
d.png
分類中不允許添加類擴(kuò)展
e.png
優(yōu)化:char NameKey;
g.png
11.png
*獲取所有成員變量
12.png
23.png
如果屬性太多, 這樣存儲(chǔ)屬性, 太麻煩.
運(yùn)行時(shí)保存屬性.png
或許成員變量的值.png
3運(yùn)行時(shí)常用的函數(shù)
1><objc/runtime.h>
Method class_getClassMethod(Class cls, SEL name)
獲得某個(gè)類的類方法
Method class_getInstanceMethod(Method m1, SEL name)
獲得某個(gè)對(duì)象的對(duì)象法
//交換兩個(gè)方法的實(shí)現(xiàn)
void method_exchangeImplemtantions(Method m1, Method m2)
2><objc/message.h>
* void objc_msgSend(void)
給某個(gè)對(duì)象發(fā)送消息