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)體指針,用來表示一個(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)建過對(duì)應(yīng)的子類的類對(duì)象
HPTargetClassManager類:用于判斷相同子類的不同實(shí)例對(duì)象,根據(jù)內(nèi)存地址判斷,并創(chuàng)建共同的方法,class, dealloc方法等
HPTargetClass類:重寫觀察對(duì)象的set方法
創(chuàng)建實(shí)例之后,打印其指向的地址,沒有變化,只有用object_getClass()發(fā)現(xiàn)isa指針發(fā)生變化,借助于NSObject+DLIntrospection, po [object_getClass(subClassA) instanceMethods]能看到對(duì)應(yīng)的實(shí)例方法發(fā)生變化