1、instance对象(实例对象)
1.1、instance对象创建
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象,object1、object2是NSObject的instance对象(实例对象)它们是不同的两个对象,分别占据着两块不同的内存。
1.2、instance对象内存结构
在内存中存储的信息包括:
isa指针
其他成员变量
@interface Person : NSObject {
int _age;
}
内存结构为:
*isa指针会排在所有成员变量的最前,所以isa指针的地址就是instance对象的地址
2、class对象(类对象)
2.1、获取class对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class objectClass1 = obj1.class;
Class objectClass2 = obj2.class;
Class objectClass3 = object_getClass(obj1); // Runtime API
Class objectClass4 = object_getClass(obj2); // Runtime API
Class objectClass5 = [NSObject class];
NSLog(@"%p,%p,%p,%p,%p",objectClass1,objectClass2,objectClass3,objectClass4,objectClass5);
打印结果:
~:0x7fff8069a008,0x7fff8069a008,0x7fff8069a008,0x7fff8069a008,0x7fff8069a008
总结:objectClass1~objectClass5都是NSObject的类对象,它们都是同一个对象,每个类在内存中有且只有一个class对象。
2.2、class对象内存结构
class对象在内存中存储的信息主要包括
isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instance method)
类的协议信息(protocol)
类的成员变量信息(ivar)
…
3、meta-class对象(元类对象)
3.1、获取meta-class对象
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)
…
*object_getClass方法的实质是返回isa指针指向的内容,所以如果传入实例对象,返回的是类对象;传入的是类对象,返回的是元类对象。 [obj class]只能返回类对象,即使调用多次也返回类对象。 objc_getClass和[obj class]一样,只能返回类对象。
3.3、元类对象判断
class_isMetaClass(objectMetaClass)