一、OC对象模型

iOS runtime 之 Class 和 MetaClass
首先,对象、类和元类的概念,看下面的图和代码可以了解。

/// id - A pointer to an instance of a class.
typedef struct objc_object *id;

/// object - Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// class - An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

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;
/* Use `Class` instead of `struct objc_class *` */

我们发现 Class 本身也有一个 isa 指针,指向的是它的 MetaClass。

  • 当我们对一个实例发送消息时(-开头的方法),会在该 instance 对应的类的 methodLists 里查找。
  • 当我们对一个类发送消息时(+开头的方法),会在该类的 MetaClass 的 methodLists 里查找。


    一、OC对象模型_第1张图片

对象在在内存中的排布可以看作是一个结构体,该结构体的大小不能动态变化,所以无法在运行时动态的给对象添加成员变量。Category可以添加方法正是因为methodlist指针的作用。objc_setAssociateObject实现机制并不相同,并没有改变对象的内存结构。

你可能感兴趣的:(一、OC对象模型)