IOS - 多态
1. 多态性
多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式。或者说相同的名字,不同的类。我们来看一个书上的示例:
- #import <Foundation/Foundation.h>
- //定义类 A
- @interface A : NSObject
- -(void)print
- @end
- @implementation
- -(void)print
- {
- NSLog(@"this is Class A");
- }
- @end
- //定义类 B
- @interface B : NSObject
- -(void)print
- @end
- @implementation
- -(void)print
- {
- NSLog(@"this is Class B");
- }
- @end
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
- A *a=[[A alloc] init];//实例化类A对象
- B *b=[[B alloc] init];//实例化类B对象
- [a print]; //调用类A的print方法
- [b print]; //调用类B的print方法
- [a release]; //释放实例a
- [b release]; //释放实例b
- [pool drain];
- return 0;
- }
程序的最终输出结果如下:
this is Class A
this is Class B
那么类A和类B都包含了print方法,那么系统怎么知道什么时候调用哪个方法呢?因为Obj-C运行环境时支持类型检查,知道类A是print消息的第一个接收者,类B是第二个接收者,那么也就是同一个方法名有不同的类实现,我们称之为多态性。
2. 动态绑定和动态类型
id是公用的对象类型,它可以用来存放任何类的对象,那么我们就再来看一个如何运用id实现动态绑定的例子:
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
- id temObj; //声明一个id<strong>类型</strong>
- A *a=[[A alloc] init];//实例化类A对象
- B *b=[[B alloc] init];//实例化类B对象
- temObj=a; //将a对象赋值给temObj
- [temObj print]; //调用类A的print方法
- temObj=b; //将b对象赋值给temObj
- [temObj print]; //调用类B的print方法
- [a release]; //释放对象a
- [b release]; //释放对象b
- [pool drain];
- return 0;
- }
在上面的代码中我们可以看到temObj被声明为id类型,因此它可以存放任何类型的对象,当temObj存放类A的对象a时,我们就可以通过temObj调用类A的全部方法,同样,当temObj存放的类B的对象b时,我们也可以通过temObj来访问类B的全部方法。
那么,程序是如何知道我们要调用哪一个类的print方法呢?很简单,因为Obj-C在运行时,环境会一直对“对象属于哪个类”进行追踪,基于动态类型和动态绑定的概念,系统会对对象的类作出正确的决定,系统会在运行的时候而不是编译的时候决定调用哪一个方法。
下面是Object类确认对象类型的基础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 - 多态的更多相关文章
- IOS多态在项目中的应用
今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...
- iOS 多态的简单思想
/** * 多态:多种形态,是对于对象而言的,如果没有继承就没有多态 * * 在代码中体现:就是通过定义父类指针指向子类的对象 * * 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候 ...
- iOS多态 动态绑定
多态和动态绑定是为了解决父类调用子类的问题 首先,声明三个类aa bb cc 都继承于fist类 #import <Foundation/Foundation.h> @interface ...
- iOS播放器、Flutter高仿书旗小说、卡片动画、二维码扫码、菜单弹窗效果等源码
iOS精选源码 全网最详细购物车强势来袭 一款优雅易用的微型菜单弹窗(类似QQ和微信右上角弹窗) swift, UITableView的动态拖动重排CCPCellDragger 高仿书旗小说 Flut ...
- Swift相比OC语言有哪些优点
Swift相比OC语言有哪些优点 1.自动做类型推断 2.可以保证类型使用安全 Swif类型说明符 --Swift增加了Tuple表示元组类型 --Swift增加了Optional表示可选类型 常量一 ...
- iOS阶段学习第13天笔记(多态)
iOS学习(OC语言)知识点整理 一.关于多态的介绍 1)多态的通俗理解,即一种事物多种形态. 2)多态的赋值兼容:即父类的引用可以指向子类的对象. 3)在多态中调用方法时看对象,不看指针,即我们要看 ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- iOS之07-三大特性之多态 + NSString类
多态 1.没有继承就没有多态 2.代码体现:父类类型的指针指向子类对象 类的创建: #import <Foundation/Foundation.h> // 动物 @interface A ...
- 李洪强iOS开发之OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
随机推荐
- JS的构造函数
//构造函数 //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法 //当对象被实例化后,构造函数会立即执行它所包含的任何代码 function myObject(ms ...
- java 自定义标签 传值
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://ja ...
- mongodb 维护
如何释放空间? 1. 先用 remove 命令删除数据 2. repair.需要停机,即便你不停机的话 mongodb 自己也会锁住直到 repair 完成.注意要有足够的磁盘空间,需要额外一倍的空间 ...
- iOS开发——UI基础-KVC
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性. 如何使用KVC存取对象属性呢?看个示例 一.使用KVC存数据 定义一个person ...
- 实战Centos系统部署Codis集群服务
导读 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可 ...
- (苹果AppleWWDRCA.cer证书过期)Failed to locate or generate matching signing assets
从2月14号开始,上传AppStore会碰到:Failed to locate or generate matching signing assets 字数462 阅读13571 评论16 喜欢61 ...
- ionic中返回上一页
.controller('NewsCtrl', ["$scope", "$ionicHistory", "$http","$tim ...
- 剑指Offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 在Coding.net创建项目开发
先在Coding上创建个项目 只要建个项目推送代码余额就会增加,积累码币可以在商城里兑换相应的商品.为了码币,我也应该建个项目搞搞啊- 记录下过程. 先在Coding上创建个项目 现在是这样,我 ...
- JQuery发送Ajax请求出现 500 Internal Server Error
ajax返回,readyState=4,status=500,chrome f12提示,提示服务器内部错误 我采用 http://q.cnblogs.com/q/69745/的解决办法根本不行,也不是 ...