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的类对象调用轨迹