02 OC对象的分类

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
NSObject *object1 = [[NSObject alloc] init];

NSObject *object2 = [[NSObject alloc] init] ;

Class objectClass1 = [object1 class];

Class objectClass2 = [object2 class];

Class objectClass3 = [NSObject class];

Class objectClass4 = object_getClass(object1);

Class objectClass5 = object_getClass(object2);
  • objectClass1 ~ objectClass5 都是NSObject的class对象 (类对象)

  • 它们是同一个对象。每个类在内存中有且只有一个class对象

  • class对象在内存存储的信息主要包括

    • isa指针
    • superclass指针
    • 累的属性信息(@property) 、类的对象方法信息(instance method)
    • 类的协议信息(protocol)、 累的成员变量信息(ivar)
meta-class (元类对象)
Class objectMetaClass = object_getClass([NSObject class]);
  • objectMetaClass是NSObject的meta-class对象

  • 每个类在内存中有且只有一个meta-class对象

  • meta-class对象和class对象在内存中的结构是一样的,但是用途不一样,在内存中存储的信息主要包括

    • isa 指针
    • superclass 指针
    • 类的类方法信息 (class method)
  • 以下代码获取objectClass是class对象,并不是meta-class对象
Class objectClass = [[NSObject alloc] init] ;
  • 查看Class是否为meta-class
BOOL result = class_isMetaClass([NSObject class]);
  • Class objc_getClass (const char *aClassName)

    • 传入字符串类名
    • 返回对应的类对象
  • Class object_getClass (id obj)

    • 1> 传入的obj 可能是instance对象,class对象、meta-class对象
    • 2>返回值
    • 如果是instance对象,返回class对象
      -如果是class对象,返回meta-class对象
    • 如果是meta-class对象,返回NSObject(基类)的meta-class对象
  • -(Class)class、 + (Class)class

    • 返回的就是类对象
  • -(Class) {
    return self -> isa;
    }

  • +(Class) {
    return self;
    }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS底层原理总结 - 探寻OC对象的本质 原文链接 对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题...
    二斤寂寞阅读 663评论 0 4
  • iOS底层原理总结 - 探寻OC对象的本质 对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索...
    xx_cc阅读 21,659评论 31 178
  • 面试题:一个NSObject对象占用多少内存? 作为一个iOS开发人员来说,iOS底层原理是必须要掌握的知识。虽然...
    朝夕向背阅读 1,198评论 0 10
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 1,445评论 0 8
  • 两天没有跑步了,明天早上必须去跑步了,我心里想到,其实定的是昨天早上去跑步的,可是下雨了 ,所以跑步计划取消。 夜...
    小叶pink阅读 484评论 3 7