iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
多态:相同的名称,不同的类
使不同的类共享相同方法名称的能力成为多态。它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名。每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类定义。这是因为Objective-C的运行时系统在执行方法时知道消息的接收者是哪个类的对象,它总是携带有关“一个对象属于哪个类”这样的信息,该信息能使系统在运行时做出决定,而不是在编译时。
动态绑定和id类型
id数据类型是一种通用的对象类型,可以用来存储属于任何类的对象。当使用id类型的时候,程序的一些测试被从编译时推迟到了运行时进行,因为在编译时系统还无法确定这个数据类型究竟是什么类型的。
如果使用动态类型来调用一个方法,需要注意一下规则:如果在多个类中实现名称相同的方法,那么每个方法都必须符合各个参数的类型和返回值类型,这样编译器才能为消息表达式生成正确的代码。
Objective-C中的类都继承自NSObject类,而这个类支持一些方法,可以用来避免错误或在程序运行时检查程序的完整性,如下:
| 方法 | 问题或行为 | 
| -(BOOL) isKindOfClass: class-object | 对象是不是class-object或其子类的成员 | 
| -(BOOL) isMemberOfClass: class-object | 对象是不是class-object的成员 | 
| -(BOOL) respondsToSelector: Selector | 对象是否能够响应selector所指定的方法 | 
| -(BOOL) instancesRespondToSelector: Selector | 指定的类实例能否响应selector | 
| -(BOOL) isSubclassOfClass: class-object | 对象是否是指定类的子类 | 
| -(BOOL) performSelector: Selector | 应用selector指定的方法 | 
| -(BOOL) performSelector: Selector withObject: object | 应用selector指定的方法,传递参数object | 
| -(BOOL) performSelector: Selector withObject: object1 withObject: object2 | 应用selector指定的方法,传递参数object1和object2 | 
这样在id类型对象上调用某方法之前,就可以先进行一些判断,来阻止可能产生的错误和崩溃。
此外,也可以采用其他策略如使用 forwardInvocation: 方法将消息转发给其他对象处理。
在实际开发中也可以通过协议来对id类型做一些约束,这样编译器就能提前知道方法调用是否正确。
iOS开发笔记系列-基础3(多态、动态类型和动态绑定)的更多相关文章
- iOS开发笔记系列-基础1(数据类型与表达式)
		学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ... 
- iOS开发笔记系列-基础2(类)
		面向对象编程总是离不开类和对象的,Objective-C也不例外,不过Objective-C中的类还有一些自己的独特点. 类的声明和定义 在iOS开发中,类的声明与定义通常都是分开的,类得声明通常存放 ... 
- iOS开发笔记系列-基础6(预处理程序)
		预处理程序提供了一些工具,使用这些工具更易于开发.阅读.修改程序,也易于将程序移植到不同的系统中.又称为宏. #define #define语句的基本用途之一就是给富豪名称指定程序常量.比如: #de ... 
- iOS开发笔记系列-基础5(分类和协议)
		分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ... 
- iOS开发笔记系列-基础7(C语言特性)
		Objective-C是C语言的扩展,因此,也具备很多C语言的基本特性,这里只罗列部分. 块(Blocks) 块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是Apple添加到语言中 ... 
- iOS开发笔记系列-基础4(变量与数据类型)
		对象的初始化 对象的初始化方法一般都如下: -(id)init { self=[super init]; if(self){ ... } return self; } 这个方法首先会调用父类的初始化方 ... 
- IOS科研IOS开发笔记学习基础知识
		这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollVi ... 
- iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现
		最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ... 
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
		KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ... 
随机推荐
- Web开发之tomcat配置及使用(环境变量设置及测试,一个简单的web应用实例)
			Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 tomcat解压到的D盘 (路径为: D:\tomcat), 配置环境变量: 启动tomcat需要两 ... 
- C++类的复制构造函数和赋值运算符
			前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中 ... 
- DB2系统管理试题标准答案
			1. 如果需要创建一个表,并把表中的索引数据和其他数据分开存储,则应该 A.建立两个SMS表空间分别存储索引数据和其他数据 B.建立两个DMS表空间分别存储索引数据和其他数据 C.建立一个DMS表空间 ... 
- maven-bundle-plugin插件, 用maven构建基于osgi的web应用
			maven-bundle-plugin 2.4.0以下版本导出META-INF中的内容到MANIFEST.MF中 今天终于把maven-bundle-plugin不能导出META-INF中的内容到Ex ... 
- javascript 库
			http://overapi.com/javascript/ 查javascript http://slimerjs.org/ 自动测试? http://www.cnblogs.com/lhb25/p ... 
- HAOI2007 理想的正方形
			1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ... 
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
			原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ... 
- SharePoint 2010 master page 控件介绍(4):隐藏placeholder
			转:http://blog.csdn.net/lgm97/article/details/6409225 <!-- form digest 安全控件用来进行form的安全校验--> &l ... 
- ollydbg z
			通达信l2密码器方法: 1:使用Ollydbg,点文件,打开,选择通达信的可执行文件(或者把通达信的执行文件直接拖进Ollydbg的窗口),按F9运行程序. 2:正常使用通达信,进入到K线图后,在k线 ... 
- ZOJ 3299-Fall the Brick(线段树+离散化)
			题意: n个区间 ,给出区间的左右坐标 ,区间内填满宽度为1的箱子,有m个板子给出板子的高度和左右坐标(同高度不重叠) 所有箱子从上向下落,求每块板子能接到的箱子数. 分析: 首先给的区间很大,一开始 ... 
