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

1,所有父类的成员变量和自己的成员变量(实例变量、私有变量、以及声明为属性生成的变量)都会存放在该对象所对应的存储空间中。

2,每个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本身对象的a,对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)b,成员变量的列表。c,属性列表。类对象内也有一个isa指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有哦一个superclass的指针,指向他的父类对象

每个Objective-C对象都有相同的结构 :


对象结构

3,根对象就是NSObject,他的superclass指针指向nil

4,类对象既然称为对象,那它也是一个实例,类对象中也有一个isa指针指向他的元类(meta class),即类对象是元类的实例,元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。

总结:

1.对象isa指向类对象,类对象的isa指向元类。元类isa指向根元类。根元类的isa指针指向自己,superclass指针指向NSObject类

2.实例对象结构体只有一个isa变量,指向实例对象所属的类。类对象有isa,superclass,方法,属性,协议列表,以及成员变量的描述。

3.所有的对象调用方法都是一样的,没有必要存在对象中,对象可以有无数个,类对象就有一个所以只需存放在类对象中

 

可以从官方objc.h源码里面找到实例定义

    /// Represents an instance of a class.

 struct objc_object {

 Class _Nonnull isaOBJC_ISA_AVAILABILITY;

    };

可以在runtime.h里面找到类对象的定义


 struct objc_class {

Class _Nonnull isaOBJC_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 methodListsOBJC2_UNAVAILABLE;//方法列表

        //用于缓存调用过的方法

 struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;

        //协议链表用来存储声明遵守的正式协议

 struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;

#endif

    }

objc中的类方法和实例方法有什么本质区别和联系

类方法:

1,类方法是属于类对象的 

2,类方法只能通过类对象调用 

3,类方法中的self是类对象 

4,类方法中不能访问成员变量 

5,类方法可以调用其他的类方法 

6,类方法中不能直接调用对象方法

实例方法:

1,实例方法是属于实例对象的 

2,实例方法只能通过实例对象调用,

3,实例方法中的self是实例对象 

4,实例方法中可以访问成员变量 

5,实例方法中直接调用实例方法

6,实例方法中可以直接调用类方法(通过类名)

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