继承是面向对象的语言一个非常重要的特性,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通过这样的一种机制来实现继承。