多态:相同的名称,不同的类

  使不同的类共享相同方法名称的能力成为多态。它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名。每个类的定义都封装了响应特定方 法所需要的代码,这使得它独立于其他的类定义。这是因为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类型做一些约束,这样编译器就能提前知道方法调用是否正确。

转载于:https://www.cnblogs.com/MyBlogZH/p/5529982.html

iOS开发笔记系列-基础3(多态、动态类型和动态绑定)相关推荐

  1. 系列:iOS开发-C语言基础

    #系列:iOS开发-C语言基础 之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90% ...

  2. Bootstrap响应式Web开发笔记01——基础入门

    Bootstrap响应式Web开发笔记01--基础入门 Bootstrap响应式Web开发笔记02--移动端页面布局 Bootstrap响应式Web开发笔记03--Bootstrap栅格系统 Boot ...

  3. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  4. iOS开发UINavigation系列四——导航控制器UINavigationController

    iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言 在前面的博客中,我么你介绍了UINavigationBar,UINavigationIte ...

  5. ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)

    iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...

  6. 【Visual C++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用

    在笔记七中我们讲解了用定时器来产生动画的效果.定时器的使用固然简单方便,但是事实上这样的方法仅适合用在显示简易动画及小型的游戏程序中.因为一般而言,游戏本身需要显示顺畅的游戏画面,使玩家感觉不到延迟的 ...

  7. Unity+C#开发笔记(一)| 如何动态加载预制件 | ╭(●`∀´●)╯╰(●’◡’●)╮

    首先是跟随这篇文章学习的~:https://blog.csdn.net/linshuhe1/article/details/51355198/~写的非常细致,感谢河乐不为大佬~ **********下 ...

  8. ios开发语言在c语言的基础上,iOS开发 - C语言基础4(基本语句和运算符) - 猫扑天空...

    iOS开发 - C语言基础4(基本语句和运算符) 基本语句 C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下 循环语句(do while.while.for) 条件语句(if .if- ...

  9. IOS开发笔记之推广安装(用网页判断是否安装App)

    IOS开发笔记之推广安装(用网页判断是否安装App) 在做App推广的时候,我们经常会用到网页链接下载,亦或是一张二维码,最常见的做法就是将App在iTunes中的下载链接嵌入,当用户扫描或者点击网页 ...

最新文章

  1. 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
  2. 微信发力了,一键部署网站后端!
  3. 2015蓝桥杯省赛---java---C---3(无穷分数)
  4. ASP.NET Core与Dapper和VS 2017使用JWT身份验证WEB API并在Angular2客户端应用程序中使用它
  5. 计算机二级显示用户不存在,计算机二级考试最常见的错误集合
  6. 网络与系统安全笔记------身份认证技术
  7. java 计算父亲节_写了一个简单的计算父亲节母亲节等日期的方法
  8. 微微一笑很倾城(2)
  9. 浅谈基于过程与基于对象
  10. vue-element-admin 框架结构粗解
  11. 魅族,一家被节操羁绊着的公司
  12. 洛谷P1567 统计天数
  13. 一种并行随机梯度下降法
  14. MacOS删除打印机软件指引
  15. 移动办公哪个邮箱更好用
  16. 文本改写和论文查重工具:探狐文案AICopy for Mac中文版
  17. 【数值模型环境搭建】Intel编译器安装
  18. 2014年实习生招聘之华为实习生招聘笔试题(上机完成)—2014/04/02
  19. 3月“ChatGPT”相关热门论文-AMiner
  20. Kotlin + Spring Boot: 下一代企业级开发

热门文章

  1. Docker安装OpenResty教程
  2. java sqlserver 遍历_mysql和sqlserver循环插入数据
  3. [Ext JS6]Sencha Cmd
  4. ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例
  5. 学生成绩abcde怎样划分_7月学考成绩出来啦!
  6. 连接MySQL时出现警告Establishing SSL connection without server's identity verification is not recommended.
  7. linux离线安装mysql8
  8. spring源码构建
  9. 基于SpringBoot 2.3的WebService指南(包含案例)
  10. mysql 5.6 emoji_让MySQL 5.6支持Emoji表情