一吕座、Objc/runtime 是一組C的API ? 作用:
1、程序運(yùn)行時候瘪板,動態(tài)創(chuàng)建類
2吴趴、程序運(yùn)行時候,動態(tài)創(chuàng)建類中方法和屬性
3侮攀、遍歷類中所有成員變量
二锣枝、廢話不多說厢拭,直接上代碼。
1撇叁、使用runtime 實(shí)現(xiàn)消息機(jī)制
(1)假設(shè)有個類Person ?聲明一個方法 ?eat
普通發(fā)送一個消息:Person *person = [[Person alloc] init]; ?[p eat];或者?[p performSelector:@selector(eat)];
runtime發(fā)送一個消息:objc_msgSend(p, @selector(eat)); ?補(bǔ)充一下 ?oc下面每一個方法都有 SEL 和IMP 組成
SEL是方法編號供鸠,IMP是方法實(shí)現(xiàn)。
(2)設(shè)置連Person *person = [[Person alloc] init]; ?都可以用runtime實(shí)現(xiàn)
Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
p = objc_msgSend(p, @selector(init));
objc_msgSend(p, @selector(eat));
(3)新建一個命令行工程陨闹,對main方法進(jìn)行轉(zhuǎn)objc代碼楞捂,命令行:clang -rewrite-objc main.m ?就可以查看
經(jīng)過驗(yàn)證,和我們寫的代碼 是一樣的趋厉。
2寨闹、runtime實(shí)際應(yīng)用 ---使用runtime實(shí)現(xiàn)序列化。
第一步:實(shí)現(xiàn)一個Person類的歸檔解檔觅廓,一般實(shí)現(xiàn):
vc實(shí)現(xiàn)存鼻忠、取操作
新建Person類 遵從NSCoding協(xié)議涵但, 假設(shè)目前2個屬性 name 和age
第二步 : 思考一個問題杈绸,一般來說我們的model模型 屬性非常多,有時候會有幾十個矮瘟,難道每一次都要重復(fù)寫encode 和 decode 代碼嗎瞳脓?解決方案就是:使用runtime獲取成員變量的列表 ?從而實(shí)現(xiàn)一勞永逸的序列化。
解釋一下:class_copyIvarList 可以用來成員變量的列表澈侠,同時count經(jīng)過這個方法之后劫侧,變成成員變量的個數(shù),返回值就是Ivar的結(jié)構(gòu)體哨啃,每一個Ivar對象 就可以通過ivar_getName 來獲取屬性名字烧栋,從而通過kvc 來獲取value。
第三步:?class_copyIvarList ?是C方法拳球,一般C里面 copy审姓、new、create 都會分配內(nèi)存祝峻,所以最后用完 ?要釋放 堆內(nèi)存中的Ivar * ? 也就是free(ivars)