1、instance对象(实例对象)

1.1、instance对象创建

  1. NSObject *obj1 = [[NSObject alloc] init];
  2. NSObject *obj2 = [[NSObject alloc] init];

instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象,object1、object2是NSObject的instance对象(实例对象)它们是不同的两个对象,分别占据着两块不同的内存。

1.2、instance对象内存结构

在内存中存储的信息包括:
isa指针
其他成员变量

  1. @interface Person : NSObject {
  2. int _age;
  3. }

内存结构为:
image.png

*isa指针会排在所有成员变量的最前,所以isa指针的地址就是instance对象的地址

2、class对象(类对象)

2.1、获取class对象

  1. NSObject *obj1 = [[NSObject alloc] init];
  2. NSObject *obj2 = [[NSObject alloc] init];
  3. Class objectClass1 = obj1.class;
  4. Class objectClass2 = obj2.class;
  5. Class objectClass3 = object_getClass(obj1); // Runtime API
  6. Class objectClass4 = object_getClass(obj2); // Runtime API
  7. Class objectClass5 = [NSObject class];
  8. NSLog(@"%p,%p,%p,%p,%p",objectClass1,objectClass2,objectClass3,objectClass4,objectClass5);

打印结果:

  1. ~:0x7fff8069a008,0x7fff8069a008,0x7fff8069a008,0x7fff8069a008,0x7fff8069a008

总结:objectClass1~objectClass5都是NSObject的类对象,它们都是同一个对象,每个类在内存中有且只有一个class对象。

2.2、class对象内存结构

class对象在内存中存储的信息主要包括
isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instance method)
类的协议信息(protocol)
类的成员变量信息(ivar)

image.png

3、meta-class对象(元类对象)

3.1、获取meta-class对象

  1. Class objectMetaClass = object_getClass([NSObject class]); // Runtime API

objectMetaClass是NSObject的meta-class对象(元类对象),每个类在内存中有且只有一个meta-class对象。

3.2、meta-class对象内存结构

meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的主要信息包括:
isa指针
superclass指针
类的类方法信息(class method)

image.png

*object_getClass方法的实质是返回isa指针指向的内容,所以如果传入实例对象,返回的是类对象;传入的是类对象,返回的是元类对象。 [obj class]只能返回类对象,即使调用多次也返回类对象。 objc_getClass和[obj class]一样,只能返回类对象。

3.3、元类对象判断

  1. class_isMetaClass(objectMetaClass)