一、instance对象(实例对象)
instance 对象:就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。
示例一:
#import <Foundation/Foundation.h> #import <objc/runtime.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init]; NSLog(@"%p %p", object1, object2); } return 0; }
object1、object2 是 NSObject 的 instance 对象(实例对象)。
它们是不同的两个对象,分别占据着两块不同的内存。
示例二:
结构分析:
instance对象在内存中存储的信息包括:
isa指针
其他成员变量
二、class对象(类对象)
#import <Foundation/Foundation.h> #import <objc/runtime.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init]; Class objectClass1 = [object1 class]; Class objectClass2 = [object2 class]; Class objectClass3 = object_getClass(object1); Class objectClass4 = object_getClass(object2); Class objectClass5 = [NSObject class]; NSLog(@"%p %p", object1, object2); NSLog(@"%p %p %p %p %p", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5); } return 0; }
objectClass1 ~ objectClass5都是NSObject的class对象(类对象)
它们是同一个对象。每个类在内存中有且只有一个class对象。
class对象在内存中存储的信息主要包括:
isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instance method)
类的协议信息(protocol)
类的成员变量信息(ivar)
…
三、meta-class对象(元类对象)
Class objectMetaClass = object_getClass([NSObject class]); NSObject *object1 = [[NSObject alloc] init]; Class objectClass1 = [object1 class]; Class objectMetaClass = object_getClass(objectClass1);
objectMetaClass是NSObject的meta-class对象(元类对象)
每个类在内存中有且只有一个meta-class对象
注意:meta-class对象和class对象的内存结构是一样的,但是用途不一样。
在内存中存储的信息主要包括:
isa指针
superclass指针
类的类方法信息(class method)
…
四、总结
#import <Foundation/Foundation.h> #import <objc/runtime.h> int main(int argc, const char * argv[]) { @autoreleasepool { // instance对象,实例对象 NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init]; // class对象,类对象 Class objectClass1 = [object1 class]; Class objectClass2 = [object2 class]; Class objectClass3 = object_getClass(object1); Class objectClass4 = object_getClass(object2); Class objectClass5 = [NSObject class]; // class方法返回的一直是class对象,类对象 // Class objectMetaClass2 = [[[NSObject class] class] class]; // meta-class对象,元类对象 // 将类对象当做参数传入,获得元类对象 Class objectMetaClass = object_getClass(objectClass5); NSLog(@"instance - %p %p", object1, object2); NSLog(@"class - %p %p %p %p %p %d", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5, class_isMetaClass(objectClass3)); NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass)); } return 0; }
拓展:
1、Class objc_getClass(const char *aClassName)
1> 传入字符串类名
2> 返回对应的类对象
2、Class object_getClass(id obj)
1> 传入的obj可能是instance对象、class对象、meta-class对象
2> 返回值
a) 如果是instance对象,返回class对象
b) 如果是class对象,返回meta-class对象
c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象
3、- (Class)class、+ (Class)class
1> 返回的就是类对象
- (Class) { return self->isa; } + (Class) { return self; }
4、OC的类信息存放在哪里?
1、对象方法、属性、成员变量、协议信息,存放在class对象中。
2、类方法,存放在meta-class对象中。
3、成员变量的具体值,存放在instance对象。