2016笔记——Runtime(三)

要深层次了解runtime运行时的机制,就要先了解类和对象的内部结构。

一、从objc.h中找到对object和class的定义:

屏幕快照 2016-04-12 14.54.52.png

由此可见:

第一行的Class,是一个指向objc_class结构体的指针。

第二行中objc_object结构体,其成员isa是一个指向objc_class结构体的指针。

第三行的id,是一个指向objc_object结构体的指针。

二、我们从runtime.h文件中查看objc_object结构体:

屏幕快照 2016-04-12 16.00.59.png

由此可见类比对象的结构体中多了众多的成员,下面详细介绍objc_class各成员:

isa:

图一中:objc_object (对象)中isa指针指向的类结构称为Class(也就是该对象所属的类),其中存放着普通成员变量与实例方法(“-”开头的方法)

图二中:isa指针指向的类结构称为metaclass,其中存放着static类型的成员变量与static类型的方法(“+”开头的方法)。

super_class: 指向该类的父类的指针,如果该类是基类,那么super_class就是NULL。

通过一幅图来看一下OC中类与对象的继承层次关系:

屏幕快照 2016-04-12 16.29.40.png

所有的metaclass中isa指针都是指向根metaclass,而根metaclass则指向自身。

根metaclass是通过继承根类产生的,与根class结构体成员一致,不同的是根metaclass的isa指针指向自身。

当我们调用某个对象的实例方法时,它会首先在自身isa指针指向的类(Class)methodLists中查找该方法,如果找不到,就会通过class的super_class指针找到其父类,然后从父类methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构结构体中查找,直至根class。

当我们调用某个类方法时,它会首先通过自己的isa指针找到metaclass,并从它的methodLists中查找该类方法,如果找不到则会通过metaclass的super_class指针找到父类的metaclass结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构中查找,直至根metaclass。

加油~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,155评论 0 9
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 850评论 0 2
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 1,480评论 1 5
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,943评论 33 466
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 1,630评论 0 8

友情链接更多精彩内容