OC对象的分类

写在前面

一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。

不晕的外圈

OC 对象主要可分为三种:

instance对象——实例对象

就是通过类alloc出来的对象。
每一个alloc出来的对象都是不同的对象,分别占据着不同的地址。

实例对象在内存中存储的信息包括:
-> isa指针
-> 其他成员变量的值

class对象——类对象

每个类在内存中有且只有一个class对象。
可以通过以下方式获得类对象

 Class cls1 = [p class];
 Class cls2 = [Person class];
 Class cls3 = object_getClass(p);

类对象在内存中存储的信息主要包括:
-> isa指针
-> superclass指针
-> 类的属性信息,类的对象放方法信息
-> 类的协议信息、类的成员成员变量

meta-class对象 ——元类对象

每个类在内存中有且只有一个元类对象,可以通过以下方式获得:
Class metaCls = object_getClass([Person class]);
元类对象和类对象的内存结构是一样的,但用途不一样,元类对象在内存中存储的信息主要包括:
-> isa指针
-> 类方法信息

注意:通过[NSObject class]class]是不能获得元类的!

易晕的内圈

那这三种对象是通过什么联系起来的呢:isa 和 superclass

1

instance的isa指向class,当调用对象方法时,通过instance的isa找的class,在class中找到对象方法的实现调用。
class 的isa 指向meta-class,当调用类方法时,通过class的isa找到meta-class,在meta-class中找到类方法的实现调用。

注:实例对象isa地址不是直接对应类对象的地址,类对象的isa地址也不是直接对应元类对象 的地址,在64bit开始,isa需要进行一次位运算才能计算出真正地址。

2.png

当Student的实例对象要调用Person的对象方法时,先通过isa找到Student的Class,然后通过Student的superclass找到Person的class,最后找到对象方法实现调用。


3.png

当Student的类对象调用Person的类方法时,先通过isa找到Student 的元类对象,在通过supercla找到Person的元类对象,最后找到方法实现调用。

网上流传经典的关系图:


4.png

总结:
instance的isa指向class

class的isa指向meta-class

meta-class的isa指向积累的meta-class

class的superclass指向父类的class,没有父类的指向nil

meta-class的superclass指向父类的meta-class
基类的meta-Class的superclass指向基类的class

instance调用对象方法的轨迹:isa找到class,方法不存在的话就通过superclass找父类

class调用类方法的轨迹:isa找打meta-class,方法不存在的话就通过superclass找父类

写在最后

捋顺了这些知识点,再看到一些面试题的时候就能沉着应对了!

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,826评论 0 9
  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的...
    有一种再见叫青春阅读 3,717评论 0 3
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 5,317评论 0 8
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 5,060评论 1 5
  • 首先说明,这篇文章几乎都是抄录的别人的博客,简书文章,在此总结,只是为了方便记忆和以后阅读,如果有什么失礼的地方,...
    LiYaoPeng阅读 10,532评论 1 14