instance实例对象、class类对象、meta-class元类对象

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)

猜你喜欢

转载自blog.csdn.net/weixin_39487291/article/details/88548117