iOS面试题:一个objc对象如何进行内存布局?(考虑有父类的情况)

  • 每一个对象内部都有一个 isa 指针,指向他的类对象,类对象中存放着本对象的:
    • 对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)。
    • 成员变量的列表。
    • 属性列表。
    • 类对象内部也有一个 isa 指针指向元对象(meta class),元对象内部存放的是类方法列表。
    • 类对象内部还有一个 superclass 的指针,指向他的父类对象。
  • 所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中。

Objective-C 对象的结构图:

  • isa 指针
  • 根类的实例变量
  • 倒数第二层父类的实例变量
  • 父类的实例变量
  • 类的实例变量
image

typedef struct objc_class *Class;
typedef struct objc_object {    
  Class isa;
} *id;

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

}

你可能感兴趣的:(iOS面试题:一个objc对象如何进行内存布局?(考虑有父类的情况))