1. 多态性

多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式。或者说相同的名字,不同的类。我们来看一个书上的示例:

  1. #import <Foundation/Foundation.h>
  2. //定义类 A
  3. @interface A : NSObject
  4. -(void)print
  5. @end
  6. @implementation
  7. -(void)print
  8. {
  9. NSLog(@"this is Class A");
  10. }
  11. @end
  12. //定义类 B
  13. @interface B : NSObject
  14. -(void)print
  15. @end
  16. @implementation
  17. -(void)print
  18. {
  19. NSLog(@"this is Class B");
  20. }
  21. @end
  22. int main(int argc, char *argv[])
  23. {
  24. NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
  25. A *a=[[A alloc] init];//实例化类A对象
  26. B *b=[[B alloc] init];//实例化类B对象
  27. [a print];          //调用类A的print方法
  28. [b print];          //调用类B的print方法
  29. [a release];        //释放实例a
  30. [b release];        //释放实例b
  31. [pool drain];
  32. return 0;
  33. }

程序的最终输出结果如下:

this is Class A

this is Class B

那么类A和类B都包含了print方法,那么系统怎么知道什么时候调用哪个方法呢?因为Obj-C运行环境时支持类型检查,知道类A是print消息的第一个接收者,类B是第二个接收者,那么也就是同一个方法名有不同的类实现,我们称之为多态性。

2. 动态绑定和动态类型

id是公用的对象类型,它可以用来存放任何类的对象,那么我们就再来看一个如何运用id实现动态绑定的例子:

  1. int main(int argc, char *argv[])
  2. {
  3. NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
  4. id temObj;            //声明一个id<strong>类型</strong>
  5. A *a=[[A alloc] init];//实例化类A对象
  6. B *b=[[B alloc] init];//实例化类B对象
  7. temObj=a;             //将a对象赋值给temObj
  8. [temObj print];       //调用类A的print方法
  9. temObj=b;             //将b对象赋值给temObj
  10. [temObj print];       //调用类B的print方法
  11. [a release];        //释放对象a
  12. [b release];        //释放对象b
  13. [pool drain];
  14. return 0;
  15. }

在上面的代码中我们可以看到temObj被声明为id类型,因此它可以存放任何类型的对象,当temObj存放类A的对象a时,我们就可以通过temObj调用类A的全部方法,同样,当temObj存放的类B的对象b时,我们也可以通过temObj来访问类B的全部方法。

那么,程序是如何知道我们要调用哪一个类的print方法呢?很简单,因为Obj-C在运行时,环境会一直对“对象属于哪个类”进行追踪,基于动态类型动态绑定的概念,系统会对对象的类作出正确的决定,系统会在运行的时候而不是编译的时候决定调用哪一个方法。

下面是Object类确认对象类型的基础API:

确认类型API表
方法 功能
-(BOOL)isKindOfClass:class-object 判断对象是否是某一种类(包括其父类)的实例
-(BOOL)isMemberOfClass:class-object 判断对象是否是某一种类(不包括其父类)的实例
-(BOOL)respondsToSelector:selector 判断对象是否有实现某个方法
+(BOOL)instancesRepondToSelector:selector 判断类的实例是否有实现某个方法
+(BOOL)isSubclassOfClass:class-object 判断一个类是否是某个类的子类
-(id)performSelector:selector 让对象调用指定的方法
-(id)performSelector:selector withObject: object 让对象调用指定的方法并且带一个参数
-(id)performSelector:selector withObject: object1 withObject: object2 让对象调用指定的方法并且带两个参数

上面的表格中提到了常用的api方法,那么在程序中我们可以灵活使用这些api来方便地实现各种动态编程语言特性,使得Obj-C拥有了很多动态脚本语言才有地特性

IOS - 多态的更多相关文章

  1. IOS多态在项目中的应用

    今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...

  2. iOS 多态的简单思想

    /** * 多态:多种形态,是对于对象而言的,如果没有继承就没有多态 * * 在代码中体现:就是通过定义父类指针指向子类的对象 * * 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候 ...

  3. iOS多态 动态绑定

    多态和动态绑定是为了解决父类调用子类的问题 首先,声明三个类aa bb cc 都继承于fist类 #import <Foundation/Foundation.h> @interface ...

  4. iOS播放器、Flutter高仿书旗小说、卡片动画、二维码扫码、菜单弹窗效果等源码

    iOS精选源码 全网最详细购物车强势来袭 一款优雅易用的微型菜单弹窗(类似QQ和微信右上角弹窗) swift, UITableView的动态拖动重排CCPCellDragger 高仿书旗小说 Flut ...

  5. Swift相比OC语言有哪些优点

    Swift相比OC语言有哪些优点 1.自动做类型推断 2.可以保证类型使用安全 Swif类型说明符 --Swift增加了Tuple表示元组类型 --Swift增加了Optional表示可选类型 常量一 ...

  6. iOS阶段学习第13天笔记(多态)

    iOS学习(OC语言)知识点整理 一.关于多态的介绍 1)多态的通俗理解,即一种事物多种形态. 2)多态的赋值兼容:即父类的引用可以指向子类的对象. 3)在多态中调用方法时看对象,不看指针,即我们要看 ...

  7. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  8. iOS之07-三大特性之多态 + NSString类

    多态 1.没有继承就没有多态 2.代码体现:父类类型的指针指向子类对象 类的创建: #import <Foundation/Foundation.h> // 动物 @interface A ...

  9. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

随机推荐

  1. JavaWeb学习总结(五十一)——邮件的发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  2. 关于QT写注册表开机自启动

    注册表中权限: 1.HKEY_CURRENT_USER 2.HKEY_LOCAL_MACHINE 网上有很多帖子都是用的2,其实这样有违用户权限,而且如果不是管理员用户,会写入不成功! 代码如下: Q ...

  3. 【转】GATK使用方法详解(包含bwa使用)

    一.使用GATK前须知事项: (1)对GATK的测试主要使用的是人类全基因组和外显子组的测序数据,而且全部是基于illumina数据格式,目前还没有提供其他格式文件(如Ion Torrent)或者实验 ...

  4. vs 工程连接错误

    现象: estMemPool.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: _ ...

  5. 关于Dijkstra最短路径算法

    Dijkstra算法,不是很明白,今天找了一些博客看了一下,决定自己也写一个为以后忘记的时候可以看做准备. 实际上,如果理解没错的话,该算法实际上和枚举法有点像,只不过,在选取出发路径的路径都是最短路 ...

  6. Ubuntu使用ApkTool进行APK反编译

    1.Apktool下载 http://ibotpeaches.github.io/Apktool/ 下载最新版本Apktool_2.1.1.jar 2.新建一个apktool目录,将Apktool_2 ...

  7. 在同一个页面使用多个不同的jQuery版本,让它们并存而不冲突

    - jQuery自诞生以来,版本越来越多,而且jQuery官网的新版本还在不断的更新和发布中,现已经达到了1.6.4版本,但是我们在以前的项目中就已经使用了旧版本的jQuery,比如已经出现的:1.3 ...

  8. FineUI第十二天---锚点布局

    锚点布局的典型结构: <x:Panel Layout="Anchor" runat="server">              <Items ...

  9. FineUI第九天---表单验证

    表单验证 步骤: 1.比如为TextBox设置Required=”true”或者ShowRedStar=”true”两个属性,表示此输入为必填项,并且在标签的后面显示一个红色的星号提示. 2.Vali ...

  10. 淘宝(阿里百川)手机客户端开发日记第十四篇 jsp提交含有上传控件表单乱码问题

    今天我来总结昨天开发的一个简单的jsp web 应用程序时,在做一个调教表单,从servlet端获取数据,这个表单里含有上传文件控件.如果我们在测试的时候,获取数据的是乱码,这时,大家可以先去掉上传控 ...