OC对象的内存存储细节

132 阅读2分钟
  • 首先定义一个类,这个类具有一些属性和方法
@interface Person:NSObject
{
    @public
    int age;
    double height;
    double weight;
}
-(void) eat:(String) food;
-(void) walk;
-(void) sleep;
@end
  • 通过类创建对象 Person *p = [Person new](每次创建一个对象都会分配一个新的存储空间);系统会帮我们同时在堆空间创建一共类对象,实例对象是我们自己手动new创建的
    • 1、开辟存储空间,通过new方法创建对象会在堆内存中开辟存储空间
    • 2.初始化所有属性
    • 3.返回指针地址,在栈空间有个局部变量P存储地址(指向堆空间)
  • 创建对象的时候返回的地址其实就是类的第0个属性的地址,但是要注意的是,类的第0个属性并不是我们自己定义的第一个属性,而是一个叫做isa的属性,isa是一共指针,占8个字节,会指向类对象
  • 类也是个对象,平时说所的创建对象就是通过一共类对象来创建
  • 类对象:系统会自动帮我们在堆空间创建一个类对象,他有一个方法列表,存储着当前类中所有的方法,上述的isa指针就是指向了这么一个类对象
  • 对象方法的执行过程:[p walk]
    • 在栈内存中找到P这个局部变量,在找到这个P指向的存储空间,找到对应存储空间的isa指针,找到isa指针对应的类,再在这个类对应的方法列表中寻找这个方法
  • 类方法的调用过程
    • 变量直接在堆内存中寻找有没有这个类对象,找到这个类后会在对应的方法列表中寻找对应的方法