美文网首页
OC对象的分类

OC对象的分类

作者: 六月的某一个早晨 | 来源:发表于2019-05-07 16:10 被阅读0次

OC中的对象,简称OC对象,主要可以分为3种:

  1. instance对象(实例对象)
  • instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
obj1、obj2是NSObject的instance对象(实例对象),它们是不同的两个对象,分别占据着两块不同的内存。
  • instance对象在内存中存储的信息包括:isa指针其他成员变量
  1. 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)。
  1. 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);
}

相关文章

网友评论

      本文标题:OC对象的分类

      本文链接:https://www.haomeiwen.com/subject/dldtgqtx.html