1. runtime 基本概念
基本數(shù)據(jù)結(jié)構(gòu):Class藻糖,Method江咳,SEL峭火,IMP爱致,id
Class:指向objc_class的結(jié)構(gòu)體指針烤送,objc_class結(jié)構(gòu)體如下:
Method:指向objc_method的結(jié)構(gòu)體指針,可以從objc_class中獲取objc_method_list糠悯,objc_method結(jié)構(gòu)體如下:
SEL:指向objc_selector的結(jié)構(gòu)體指針帮坚,用來(lái)表示一個(gè)方法的名字,結(jié)構(gòu):typedef struct objc_selector *SEL互艾;
IMP:函數(shù)指針试和,指向的函數(shù)包含一個(gè)接受消息的對(duì)象id,函數(shù)的方法名字忘朝,以及函數(shù)的若干個(gè)參數(shù)灰署, 結(jié)構(gòu):typedef void (*IMP)(void /* id, SEL, ... */ );
id:指向objc_object結(jié)構(gòu)體的指針局嘁,objc_object中只包含一個(gè)指向objc_class的isa指針,所以任何繼承NSObject的對(duì)象都可以用id表示晦墙;
2. KVO實(shí)現(xiàn)代碼
HPNotificationCenter類:用于判斷是否已經(jīng)創(chuàng)建過(guò)對(duì)應(yīng)的子類的類對(duì)象
HPTargetClassManager類:用于判斷相同子類的不同實(shí)例對(duì)象悦昵,根據(jù)內(nèi)存地址判斷,并創(chuàng)建共同的方法晌畅,class, dealloc方法等
HPTargetClass類:重寫(xiě)觀察對(duì)象的set方法
創(chuàng)建實(shí)例之后但指,打印其指向的地址,沒(méi)有變化抗楔,只有用object_getClass()發(fā)現(xiàn)isa指針發(fā)生變化棋凳,借助于NSObject+DLIntrospection, po [object_getClass(subClassA) instanceMethods]能看到對(duì)應(yīng)的實(shí)例方法發(fā)生變化