通过runtime对class的理解

2017-06-28  本文已影响0人  OldGhosht

核心规则:类的实例对象的 isa 指向该类;该类的 isa 指向该类的 metaclass。

通俗说法:成员方法记录在class method-list中,类方法记录在meta-class中。即instance-object的信息在class-object中,而class-object的信息在meta-class中。class 是 instance object 的类类型。当我们向实例对象发送消息(实例方法)时,我们在该实例对象的 class 结构的 methodlists 中去查找响应的函数,如果没找到匹配的响应函数则在该 class 的父类中的 methodlists 去查找(查找链为上图的中间那一排)。如下面的代码中,向str 实例对象发送 lowercaseString 消息,会在 NSString 类结构的 methodlists 中去查找 lowercaseString 的响应函数。

struct objc_class {

Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

Class super_class                                        OBJC2_UNAVAILABLE;

const char *name                                        OBJC2_UNAVAILABLE;

long version                                            OBJC2_UNAVAILABLE;

long info                                                OBJC2_UNAVAILABLE;

long instance_size                                      OBJC2_UNAVAILABLE;

struct objc_ivar_list *ivars                            OBJC2_UNAVAILABLE;

struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;

struct objc_cache *cache                                OBJC2_UNAVAILABLE;

struct objc_protocol_list *protocols                    OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

上一篇下一篇

猜你喜欢

热点阅读