OC对象的分类
Objective-C中的对象,简称OC对象,主要可以分为3种
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
instance
概念:instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
instance获取方式:
NSObjcet *object1 = [[NSObjcet alloc] init];
NSObjcet *object2 = [[NSObjcet alloc] init];
// 打印地址可发现分别占据着两块不同的内存
特性:object1和object2都是NSObject的instace对象(实例对象),
但他们是不同的两个对象,并且分别占据着两块不同的内存。
instance对象在内存中存储的信息包括:
- isa指针
- 其他成员变量
为什么所有成员变量里都有isa?
答,因为OC类都继承自NSObject
class对象
类对象特性:一个类的类对象是唯一的,在内存中是同一个的。
类对象获取方式:
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = [NSObject class];
// runtime
Class objectClass4 = object_getClass(object1);
Class objectClass5 = object_getClass(object2);
//验证类对象是唯一的。存储的地址都是唯一的
NSLog(@"%p %p %p %p %p", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5);
class对象在内存中存储的信息主要包括
- isa指针
- superclass指针
- 类的属性信息(@property),类的成员变量信息(ivar)
- 类的对象方法信息(instance method),类的协议信息(protocol)
- ……
meta-class
元类对象获取方式:
//runtime中传入 类对象 此时得到的就是元类对象
Class objectMetaClass = object_getClass([NSObject class]);
class_isMetaClass(objectMetaClass) // 判断该对象是否为元类对象
特性:每个类在内存中有且只有一个meta-class对象
作用:存放了类方法。而class存放 类的对象方法
meta-class对象在内存中存储的信息主要包括:
- isa指针
- superclass指针
- 类的类方法的信息(class method)
- ……
除了类方法,meta-class对象和class对象的内存结构是一样的
isa 指针
在调用方法时,isa的作用:
找到class类,最后找到
对象方法
找到meta-class元类,最后找到
类方法
- instance的isa指向class,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。
- class的isa指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用