Objective-C中的对象,简称OC对象,主要可以分为3种:
instance
对象(实例对象)
class
对象(类对象)
meta-class
对象(元类对象)
instance(实例对象)
instance
对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
object1、object2是NSObject的instance对象(实例对象),他们是不同的两个对象,分别占据着两块不同的内存。instance对象在内存中存储的信息包括:isa指针、其他成员变量
class(类对象)一个类的类对象在内存中是一份
- objectClass1~objectClass5都是NSObject的class对象(类对象)
- 它们是同一个对象,每个类在内存中有且只有一个class对象
- class(类对象)在内存中存储的信息主要包括:
isa指针
superclass指针
类的属性信息(@property)、类的对象方法信息(instance method)
类的协议信息(protocol)、类的成员变量信息(ivar)
......
meta-class对象(元类对象)
- objectMetaClass是NSObject的meta-class对象(元类对象)
- 每个类在内存中有且只有一个meta-class对象
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
isa指针
superclass指针
类的类方法信息(class method)
......
//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];
//meta-class对象,元类对象
//将类对象作为参数传入,获得元类对象
Class objectMetaClass = object_getClass([NSObject class]);
NSLog(@"instance = %p %p",object1,object2);
NSLog(@"class = %p %p %p %p %p",objectClass1,objectClass2,objectClass3,objectClass4,objectClass5);
NSLog(@"meta-class = %p",objectMetaClass);
打印结果:
2023-03-15 21:45:20.201798+0800 Objective本质[87660:123599346] instance = 0x600000c70140 0x600000c70150
2023-03-15 21:45:20.204894+0800 Objective本质[87660:123599346] class = 0x109124310 0x109124310 0x109124310 0x109124310 0x109124310
2023-03-15 21:45:20.204996+0800 Objective本质[87660:123599346] meta-class = 0x1091242c0
网友评论