objective-c 继承机制 (从runtime的角度)

来源:互联网 发布:看不见的客人 知乎 编辑:程序博客网 时间:2024/06/10 09:25

继承是面向对象的语言一个非常重要的特性,Objective-c(下面简称OC)也不例外,支持继承机制,(当然多继承除外)

但是,一个以c为基础的语言是如何实现继承的呢?这边文章从runtime的角度去分析下这个问题。runtime是OC的一个非常重要的特性,它把一些很重要的决定(对象类型,函数的执行等)从编译期推迟到运行时,从而能实现很多的动态特性。

其中,runtime的一个很重要的基础是一个叫dispatch table的结构。每个OC对象在创建的时候都有一个叫 isa 的指针指向该对象的class struct。class struct主要由两部分组成,一个是一个指向该类的父类的指针,一个是该类的dispatch table。dispatch table 是一个表结构,其中的每条记录是该类所实现的函数的selector和其所对应的函数实现的地址。

具体结构如下图:


因此单一条消息发送到一个对象时(OC的函数调用由信息的机制来实现),objc_msgSend 函数通过该对象的isa指针找到该对象的class struct,然后在该对象的类的dispatch table 里查找是否有响应该信息的函数,如果没有找到,则通过super向父类的dispatch table里查找,一直这样查找直到到达根类 NSObject 类。一旦找到响应该消息的响应函数,objc_msgSend就把传递来得参数交给它并执行返回。

OC通过这样的一种机制来实现继承。

0 0
原创粉丝点击