1,何为多态:不同对象可以访问相同方法的能力或现象。
2,多态的优势:不同的类对象可以使用习惯的调用方式;简化了编程接口;实现类和实例的接口隔离。

动态绑定,多态,在C++中主要是指基类指针,调用继承类所实现的虚方法。

在object C中, 有比较新的展现形式。
(一)消息机制
oc中的消息机制就是 一个动态绑定的过程,
           每个类实例的第一个字段isa指针,指向类的结构体定义,里面有函数列表,缓存函数列表,协议列表,类名,实例参数列表,实例大小.....。
           消息调用过程:编译过程中会在函数调用的代码处添加, obj_msgSend: 函数调用;程序运行期,此函数完成动态绑定的所有过程。按照编译期改为 obj_msgSend 写时,填入的调用类,被调用者类,和他们的函数列表,找到对应的IMP即函数指针,完成函数调用。

           objc_msgSend(receiver, selector, arg1, arg2, ...)

该消息函数做了动态绑定所需要的一切:

  • 它首先找到选标所对应的方法实现。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。

  • 然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传给找到的方法实现。

  • 最后,将方法实现的返回值作为该函数的返回值返回。

(二)delegate,protocol配合的观察者模式,是oc中多态的最常见运用方式
观察者注册,符合某种protocol的id实例指针,
当被观察者认为条件满足是,通过实例指针id,去调用protocol规定的同一种方法即可。

不论多少个观察者,只要都实现了protocol规定的方法,都可以完成调用,

Object-C难以理解的一些概念

1.object-c 怎么实现多态

答:多态是在runtime里面实现的,在编译的时候,compiler把所有class的定义都存放在class 实例对象里面,class实例对象包含了class的父class 实例对象的地址,class方法的select id和地址, class变量的偏移等。所有new出来的object都是从NSObject继承过来的,所以所有对象都自动包含了一个isa的指针,这个指针在调用alloc为object分配地址的时候被指向class对象的地址,在运行的时候,我们调用class 方法是通过给object发送消息

[myobj method]这样的形式,但编译器会把这句话替换成

id objc_msgSend(id theReceiver, SEL theSelector, ...)

第一个参数就是myobj,第二个参数是“method”这个字符串经过编码以后得到的唯一值,apple在runtime的时候查找method都是用

selector来做的,这样效率会比字符串比较的效率要高。

objc_msgSend这个函数的执行过程大概就是,从thereceiver(也就是myobj)里面得到isa的地址,这个地址指向前面讲到的

编译器生成的class的object实例的地址(具体的结构请参考The Objective-C Programming Language),然后比较方法的selector

如果找到了,就知道了method的地址,就直接调用了。

2.对象的method是怎么访问对象 变量的?

答:在编译期间,编译器可以知道指定class的所有继承关系,所以它也知道要生成的object包含的所有变量(包含了父类的)。这样

它就能算出所有变量相对于oject的首地址的偏移。在运行的时候,我们这样调用object 的方法:

[myobj method];

实际上编译器会隐含的把myobj的地址传递给method,所谓第一个参数(这个就是隐含参数的概念,请参考apple object c的文档)

这样知道了object的首地址和变量的偏移,也就知道了变量的地址。

3。self和super关键字是怎么实现的?

答:这个是面对对象语言容易出错的地方,必须要理解这两个关键字的实现原理才能掌握他们的正确使用方法,请参考apple

object c文档中举的例子来了解为什么非常容易出错。

上面我们提到了method在被调用的时候,会被传入隐含参数,第一个隐含参数就是object的地址,self实际上在编译期间被替换成了

ojbect的地址,所以堆self发送的消息都是根标准流程一样通过isa链找到method来执行。

super就不一样,super关键字被编译器替换成了

id objc_msgSendSuper(struct objc_super *super, SEL op,  ...)

其中objc_super的结构是

struct objc_super
{
id receiver;
Class class;
};

注意到

objc_msgSendSuper

id objc_msgSend(id theReceiver, SEL theSelector, ...)的区别,多了一个Class class;

class实际上就指向了找到当前method的class 对象的实例。

所以在objc_msgSendSuper中查找方法是从参数class指向的class 实例对象的isa开始查找的,而不是从theReceiver也就是myobj

这个对象的isa开始查找的

object c中的多态相关推荐

  1. 重写Java Object类中的equals()方法

    Java中的Object类中的equals方法 Object类的equals方法 重写Object类的equals()方法 Person类默认继承了Object类,所以可以使用Object类的equa ...

  2. java泛型类指定多个泛型_Java泛型中的多态

    java泛型类指定多个泛型 从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ...

  3. Java泛型中的多态

    从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ArrayList(); ...

  4. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态

    1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更 ...

  5. java中实现多态的机制

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  6. python中的多态和鸭子模型

    多态性 是允许将父对象设置成为和一个或多个它的子对象相等的技术,比如Parent:=Child: 多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执 ...

  7. Dart中抽象类 多态以及接口

    Dart中抽象类:Drat抽象类主要是用于定义标准,子类可以继承抽象类,也可以实现抽象类接口. 1.抽象类通过abstract关键字来定义 2.Drat中的抽象方法不能用abstract声明,Dart ...

  8. python中的多态是什么_Python中的多态

    python中的多态是什么 Polymorphism is a concept of Object Oriented Programming, which means multiple forms o ...

  9. 通过实例说明Java中的多态

    转载自:ZXSOFT's Blog - 张旋.NET Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();(其中Child是Father的子类).这样就产生了一 ...

  10. java中的多态_Java中的多态

    多态与HoFs 朋友们好久不见啊,最近笔者同时在写脚本型语言--JavaScript,和工业级的面向对象语言--Java. 在写代码的同时呢,也会思考这些语言的不同.今天就拿 Java 中的多态,来谈 ...

最新文章

  1. 小虎计算器-技术支持
  2. 专有云到混合云,是云计算的下半场?
  3. 暑期集训1:C++STL 练习题B:HDU-1004
  4. mysql学习之-密码管理(默认密码,修改密码,解决忘记密码)
  5. 利用流水线改进代码中的if处理流程
  6. c#与java_C#与Java的区别
  7. 9、oracle数据库下的视图和同义词
  8. linux文件赋予755权限,Linux文件和目录的777、755、644权限解释
  9. 专题导读:大数据支撑的智能应用
  10. 计算当前时间往加N天后的时间,Date,SimpleDateFormat,Calendar
  11. 清除浮动的七种方式方法(实例代码讲解)
  12. 数电实验三:组合逻辑电路分析与设计
  13. JavaScript函数(二)回调函数
  14. Java简单端口扫描器
  15. dhtml(灯火通明类似的词语)
  16. AR游戏觉醒,或将成为手游未来独角兽
  17. 亚马逊云科技为全球的可持续发展进程做出贡献
  18. 2021年华数杯数学建模B题进出口公司的货物装运策略求解全过程文档及程序
  19. 工控机的日常维护方法及步骤
  20. 外包公司干了不到 3 个月,我离职了

热门文章

  1. 【100个 Unity小知识点】☀️ | Unity 可以在编辑器中读取Excel,打包成exe后就无法读取的问题
  2. 深入理解LSTM神经网络
  3. (python)GA(遗传算法)优化LSTM神经网络(亲测成功,速度慢)
  4. 【Redis】client客户端 工具 redis-cli
  5. 淘宝商城事件:中小卖家缺失的互联网信任
  6. 谷歌插件无法显示在地址栏右侧
  7. c语言英美姓名,英美常用人名——C-D
  8. matlab 汽车 流场,MATLAB编程与汽车仿真应用
  9. idea 导出项目结构树
  10. 华硕 PRIME H410M-K + i5-10400F 黑苹果 EFI文件