美文网首页
Runtime之对象,类

Runtime之对象,类

作者: o0阿拉斯加的狗0o | 来源:发表于2016-12-11 17:01 被阅读20次

    对象

    我们知道对象是某个的实例,并且这个对象的isa指针指向它所属的类。来看一下它的定义,实际上是一个objc_object类型的结构体。这个结构体指针可以使用id来代替,所以id可以指向任何对象。

    typedef struct objc_object *id;
    
    对象的定义

    先来看一下runtime中的定义:

    typedef struct objc_class *Class;
    
    类的定义
    可以看到,类中定义了成员变量old_ivar_list,方法列表old_method_list,遵守的协议old_protocol_list
    当我们调用[receiver message]来给一个对象发送消息时,这个对象会跟isa找到对象所属的类,看类中能不能响应这个消息,如果不能响应,会继续根据superclass去寻找父类。
    Objective-C中的类本质上也是对象,称为类对象对象都是某个类的实例,那么类对象又是什么类的对象呢?元类
    Objective-C中又个非常特殊的类,NSObject,类都继承于这个类,这个类只有一个成员变量isa指针,继承于NSObject的类都继承了这个成员变量。 NSObject类定义

    元类(metaclass)

    我们上面提到,Objective-C中的类也是对象,它是元类的实例。
    上面说到,我们调用实例方法,对象会根据isa找到类,看类能不能响应。
    如果调用类方法,同样类对象也会根据isa找到元类,看元类能不能响应这个类方法。

    实例方法保存在类中,类方法保存在元类中

    那么问题又来了,元类是对象吗?如果是,它是什么类的实例?
    元类也是对象,是某个类的实例,元类是根元类(root metaclass)的实例。
    <a name="fenced-code-block">所有元类所属的类都是同一个根元类</a>,根元类也是元类,它所属的类也是根元类,就是它本身。根元类就是根类的元类,就是根类NSObject对应的元类
    看一张图:

    相关文章

      网友评论

          本文标题:Runtime之对象,类

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