OC对象主要分三种:
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
instance(实例对象)
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象;
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
- obj1,obj2是 NSObject 的 instance 对象(实例对象)
- 它们是两个不同的对象,占用着两块不同内存
instance对象在内存中存储的信息包括
- isa指针
- 其他成员变量
Class(类对象)
Class objClass1 = [obj1 class];
Class objClass2 = [obj2 class];
Class objClass3 = [NSObject class];
Class objClass4 = object_getClass(obj1); //runtime API
Class objClass5 = object_getClass(obj2);
- objClass1 ~ objClass5都是NSObject的class对象;
- 它们是同一个对象,每个类在内存中有且只有一个class对象;
- class对象在内存中的存储信息主要包括:
- isa指针
- superclass指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
meta-class(元类对象)
Class metaObj = object_getClass([NSObject class]); //runtime API
- metaObj 是 NSObject 的 meta-class 对象(元类对象);
- 每个类在内存中有且只有一个meta-class;
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中的存储信息主要包括
- isa指针
- superclass指针
- 类的类方法信息(class method)
查看class 是否为 meta-class?
class_isMetaClass([[NSObject class] class])
BOOL isMetaClass = class_isMetaClass(object_getClass([NSObject class]));
NSLog(@"是否是元类对象%d",isMetaClass); //1
BOOL isMetaClass2 = class_isMetaClass([[NSObject class] class]);
NSLog(@"是否是元类对象%d",isMetaClass2); //0
以下代码获取的objectClass是class对象,并不是meta-class对象
Class objClass = [[NSObject class] class];