1).OC對象分類:
實例對象(Instance對象)
類對象(Class對象)
元類對象(Meta-class對象)
1.實例對象
實例對象在內存中主要存儲:
1.isa指針
2.其他成員變量
2.類對象(class)
同一個類生成的類對象是同一個,每個類在內存中只有一個class對象
class對象在內存中主要存儲
1.isa指針
2.superClass指針
3.類的屬性信息(property),類的對象方法信息(instance method)
4.類的協議信息(protocol),類的成員變量信息(ivar)
3.元類對象(meta-class)
向 object_getClass(傳入類對象)獲取元類對象
元類對象在內存中主要存儲
1.isa指針
2.superclass指針(根元類)
3.類方法
2).對象的isa指針與superclass
1.isa:
????????實例對象(instance)的isa指針,指向類對象(class),
????????類對象(class)的isa指針,指向元類對象(meta-class)
? ? ? ? 元類對象(meta-class)的isa指針,指向基類的元類(meta-class)
2.superclass:
? ? ? ? class的superclass指向父類的class
? ? ? ? 如果沒有父類,superclass的指針為nil
? ? ? ? meta-class的superclass指向父類的meta-class(基類meta-class除外)
? ? ? ? 基類的meta-class的superclass指向基類的類對象
3.方法調用原理:
personClass:NSObject
-(void)personInstanceMethod()
+(void)personClassMethod()
studentClass: personClass
-(void)studentInstanceMethod()
+(void)studentClassMethod()
student實例對象調用studentInstanceMethod()時,先根據isa指針,找到它的類對象,在類對象中調用實例方法
studentClass對象調用studentClassMethod()時,studentClass的類對象,先根據isa指針,找到它的元類對象,在元類對象中調用類方法
student實例對象調用personInstanceMethod()時,先根據isa指針,找到它的類對象,類對象根據類對象的superclass指針找到personClass類對象,在personClass類對象中調用該實例方法
studentClass類對象調用personClassMethod()時,先根據studentClass類對象的isa指針,找到studentClass類對象的studentMetaClass元類對象,元類對象根據superClass指針,找到personMetaClass元類對象,在personMetaClass元類對象中調用該類方法
總結:
當調用對象方法時,通過instance(實例對象)的isa找到class(類對象),如果在class(類對象)中沒有找到方法,會根據class(類對象)的superclass在父類中找方法,最后如果找到方法,則進行調用,沒有找到方法則報錯。
當調用類方法時,通過class的isa找到meta-class,最后找到類方法的實現進行調用。(中途會根據meta-class的superclass找到對應的類方法)
附圖:class的類對象調用軌跡