美文网首页
OC对象学习(实例对象、类对象、元类对象)

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

作者: 丶月月鸟 | 来源:发表于2019-12-10 19:04 被阅读0次

    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对象学习(实例对象、类对象、元类对象)

          本文链接:https://www.haomeiwen.com/subject/btsvwctx.html