instance实例对象、class类对象、meta-class元类对象
1、instance的isa指向class
1>当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。
2、class的isa指向meta-class
1>当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。
- instance
1、instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
1>object1、object2是NSObject的instance对象(实例对象)
2>他们是不同的两个对象,分别占据着两块不同的内存
3>instance对象在内存中存储的信息包括
(1)isa指针
(2)其它成员变量
@interface Person : NSObject
{
@public int _age;
}
@end
Person *p1 = [[Person alloc] init];
p1->_age = 3;
Person *p2 = [[Person alloc] init];
p2->_age = 4;
- class
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = [NSObject class];
Class objectClass4 = object_getClass(object1);//Runtime API
Class objectClass5 = object_getClass(object2);//Runtime API
1、objectClass1、objectClass5都是NSObject的class对象(类对象)
2、它们是同一个对象,每个类在内存中有且只有一个class对象
3、class对象在内存中存储的信息主要包括:
(1)isa指针
(2)superclass指针
(3)类的属性信息(@property)、类的对象方法信息(instance method)
(4)类的协议信息(protocol)、类的成员变量信息(ivar)
object1和object2是实例对象、objectClass1是类对象
- meta-class对象,元类对象
//将类对象当做参数传入,获得元类对象
Class objectMetaClass = object_getClass(objectClass5);
// - (void)test;放在类对象里面
// +(void)test;放在元类对象里面
每个类在内存中有且只有一个meta-class对象
Class objectMetaClass = object_getClass([NSObject class]);//Runtime API
1、objectMetaClass 是 NSObject的meta-class对象(元类对象)
2、每个类在内存中有且只有一个meta-class对象
3、meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
(1)isa指针
(2)superclass指针
(3)类的类方法信息(class method)