Objective-C继承(Inheritance)——工作机制分析

0x01 方法的调度


不支持继承程序中的方法调度


支持继承程序中的方法调度



1、Circle类拥有一个指向其超类Shape的引用指针。消息传递时,Objective-C的方法调度机制会使用该指针来找到正确的方法实现;

2、当代码发送消息时,Objective-C的方法调度机制将在当前的类中搜索响应的方法。如果无法在接收消息的对象中找到相应的方法,它就会在该对象的超类中进行查找;

3、必要时,Objective-C会在继承链中的每一个类中重复地执行查找操作。如果在最顶层的类中也没找到该方法,则会出现运行错误。



0x02 实例化变量

在创建一个新类时,其对象首先会从它的超类继承实例变量,然后根据自身情况添加自己的实例变量。

假设我们要创建一个新的圆角矩形RoundRectangle类,其中需要一个变量来记录绘制时的拐角半径,以下是类的接口代码:

@interface RoundedRectangle : Shape
{
@private
int radius; }
@end // RoundedRectangle

用UML图表示RoundRectangle对象的内存布局:


1、由内存图表可以看到,NSObject类声明了一个isa的实例变量保存着一个指向对象当前类的指针,然后Shape类声明了两个实例变量fillColor和bounds,最后是由RoundRectangle类声明的实例变量radius;

2、因为继承属性在子类和超类之间建立了一种“is a...”的关系,所以NSObject的实例变量命名为isa;

3、每个方法调用都获得了一个名为self的隐藏参数,它是一个指向接收消息的对象的指针。这些方法通过self参数来寻找它们需要用到的实例变量:



猜你喜欢

转载自blog.csdn.net/qq_33737036/article/details/80990029
今日推荐