OC对象学习(实例对象、类对象、元类对象)

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

你可能感兴趣的:(OC对象学习(实例对象、类对象、元类对象))