OC中的对象,主要可以分为三类:
instance对象
instance对象(实例对象)就是通过类alloc出来的对象,每次类调用alloc都会生成一个新的instance对象。instance对象在内存中存储的主要信息有:
- isa指针
- 其他类的成员变量(值)
1 | NSObject *obj1 = [[NSObject alloc] init]; |
obj1和obj2就是两个NSObject的实例对象,分别占据两块的不同的内存。
class对象
每个类在内存中有且只有一个class对象(类对象),class对象在内存中存储的主要信息有:
- isa指针
- superclass指针
- 类的属性信息(@property)
- 类的对象方法信息(instance method)
- 类的协议信息(protocol)
- 类的成员变量信息(类型,名称)
下面代码获取到的都是NSObject类对象:
1 | NSObject *obj1 = [[NSObject alloc] init]; |
meta-class对象
每个类在内存中有且只有一个meta-class对象(元类对象)。meta-class对象和class对象的内存结构是一样的,但是用途不一样。meta-class对象在内存中存储的主要信息有:
- isa指针
- superclass指针
- 类方法信息(class method)
- ……
下面代码获取到的metaClass就是NSObject的meta-class对象:
1 | Class metaClass = object_getClass([NSObject class]); |
可以通过class_isMetaClass
方法判断一个Class对象是否为meta-class对象。
需要注意的是,以下代码获取到的是Class对象,并不是meta-class对象:
1 | Class objClass = [[NSObject class] class]; |
注意点
- Class objc_getClass(const char *aClassName)
- 传入字符串类名
- 返回对应的类对象
- Class object_getClass(id obj)
- 传入的obj可能是instance对象、class对象、meta-class对象
- 如果传入的是instance对象,返回class对象
- 如果传入的是class对象,返回meta-class对象
- 如果传入的是meta-class对象,返回NSObject(基类)的meta-class对象
- -(Class)class、+ (Class)class 返回的就是类对象