OC中的对象,简称OC对象,主要可以分为3种:
-
instance对象(实例对象)
- instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
obj1、obj2是NSObject的instance对象(实例对象),它们是不同的两个对象,分别占据着两块不同的内存。
- instance对象在内存中存储的信息包括:isa指针、其他成员变量。
-
class对象(类对象)
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class objCls1 = [obj1 class];
Class objCls2 = [obj2 class];
Class objCls3 = [NSObject class];
Class objCls4 = object_getClass(obj1);
Class objCls5 = object_getClass(obj2);
objCls1~ objCls5都是NSObject的class对象(类对象),它们是同一个对象,每个类在内存中有且只有一个class对象。
- class对象在内存中存储的信息主要包括:
isa指针、
superclass指针、
类的属性信息(@property)、类的对象方法信息(instance method)、
类的协议信息(protocol)、类的成员变量信息(ivar)。
-
meta-class对象(元类对象)
Class metaCls = object_getClass([NSObject class]); // Runtime API
注:Class metaCls = [[NSObject class] class]; // 获取到的objectClass是class对象,不是meta-class对象
查看class是否为meta-class
BOOL result = class_isMetaClass([NSObject class]);
- 每个类在内存中有且只有一个meta-class对象
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息只要包括:
isa指针、
superclass指针、
类的类方法信息(class method)
......
两个函数区别:
1.Class object_getClass(id obj)
{
// obj如果是instance对象,返回class对象
// obj如果是class对象,返回meta-class对象
// obj如果是meta-class对象,返回NSObject(基类)的meta-class对象
if (obj) return obj->getIsa();
else return Nil;
}
2.Class objc_getClass(const char *aClassName)
{
// 将一个字符串类名传进去,返回一个类对象
if (!aClassName) return Nil;
// NO unconnected, YES class handler
return look_up_class(aClassName, NO, YES);
}
网友评论