OC基础6:多态、动态类型和动态绑定
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。
1、关于SEL类型的数据:
(1)、SEL类型的数据包含的是一个方法,使用@selector()把一个方法名包含在括号内,就可以取到这个方法,然后可以以这个数据作为参数去调用一些方法;
(2)、一般用于那些处理动态类型的方法中,比如有方法-(BOOL)respondToSelector: selector,这个方法是判断某个类能否响应某个方法。比如有实例a,有方法b,这个方法的应用如下:
[a respondToSelector: @selector(b)];
当然它的返回值是BOOL类型,需要用来做判断,这里不做演示。这个例子可以说明@selector是怎么使用的;
(3)、对于放在@selector括号里面的方法名后面的分号:如果方法没有参数,那么括号里不能写上分号,比如:@selector(b),如果方法有参数,则全部分号都必须写上,比如:@selector(add:and:)或者:@selector(b:);
(4)、对于所有的类,只要方法名是一样的,产生的selector都是一样的。
2、使不同的类共享相同的方法名称的能力成为多态。假如Fraction类和Complex类都包含了add:方法,并且分别有实例f1、f2、f3、c1、c2、c3,那么当执行以下语句的时候:
f1 = [f2 add: f2];
c1 = [c2 add: c3];
编译器会自动匹配Fraction类和Complex类各自的add:方法,这就是多态。
3、id类型是一种通用的对象类型,可以用来存储任何类的对象。同时需要注意,在声明类的实例的时候是要用到“*”号的(比如“Fraction *f1;”),而声明一个id类型的对象时,不需要用到“*”号(比如“id dataValue;”)。
4、关于动态绑定:在编译的时候无法确定对象的类型,直到在运行的时候才能确定,进而确定要调用的方法。比如使用id类型定义一个对象,然后使用这个对象调用方法,那么编译的时候编译器无法确定这个对象的类型,直到运行的时候才能正确匹配。
5、动态绑定也会带来一些问题,比如A类不包含方法b:,那么以下语句:
…
id a = [[A alloc] init];
[a b];
…
编译器无法检查出错误,因为在动态绑定之前,编译器并不知道a的类型,所以也无法判断a使用b:方法是否正确。
6、id变量不能使用点运算符,编译器会报错。
7、编译器在编译的时候不会检查id类型的具体类型的!
8、当使用动态类型的对象作为参数来调用方法的时候,如果调用了不同的类相同名称的方法,必须保证:每个方法需求的参数类型和返回值类型必须匹配。即是动态类型的对象在运行时被赋予了确定的类型时,这个类型必须能够匹配代码中调用的方法所需要的类型。比如dataValue1和dataValue2是id类型,有如下代码:
result = [dataValue1 add: dataValue2];
那么编译器仍然会生成代码,它是通过假设来处理返回值的。这时候如果在运行时dataValue1和dataValue2被赋予的类型和add:方法不匹配,那么就会出现错误。
9、关于对象的静态类型和动态类型:
静态类型的对象即是对对象的类型已经进行过显式声明的,比如“Fraction *f1;”,它的类型是确定的、不变的、静态的;动态类型的对象即是对象的类型并未在一开始就确定(但是可能会先有声明),比如“id f1;”,它的类型是未定的、可变的、动态的。
10、类名并不等同于类,比如在程序中,Fraction这个名字并不等同于Fraction类,如果需要使用到Fraction的类,需要使用以下代码:
[Fraction class];
那么就能取到Fraction的类。这种做法的作用是,有时可以做如下判断:
if ([a clsaa] == [b class])
可以知道a和b是不是属于同一个类;
11、关于@try块处理异常,一般的处理模板如下:
…
@try {
[f noSuchMethod];
}
@catch (NSException *exception) {
…
}
…
12、另外如果出现@finally块的话,无论@try块内是否会抛出异常,@finally块都会执行。
OC基础6:多态、动态类型和动态绑定的更多相关文章
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)
五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...
- 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...
- Objective-C路成魔【11-多态性、动态类型和动态绑定】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...
- Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。
https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...
- C++中的动态类型与动态绑定、虚函数、运行时多态的实现
动态类型与静态类型 静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型.静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变.通俗的讲,就是上下文无关,在编译时 ...
- objective-c系列-动态类型和动态绑定
/* 静态类型: 变量的类型在编译之时就被确定下来. 动态类型: 对象的类型由对象的内存里的某个结构数据来决定它是什么类型, 而不是在编译之时就被确定下来的数据类型. 对象的类型只有在运行时才知道. ...
- C++基础知识:动态类型识别
1.动态类型指的是基类指针所指向的对象的实际类型 2.C++中的多态根据实际的对象类型调用对应的虚函数(1)可以在基类中定义虚函数返回具体的类型信息(2)所有的派生类都必须实现类型相关的虚函数(3)每 ...
- Python基础系列讲解—动态类型语言的特点
前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...
随机推荐
- bootstrap绿色大气后台模板下载[转]
From:http://www.oschina.net/code/snippet_2364127_48176 1. [图片] 2. [文件] 素材火官网后台模板下载.rar ~ 4MB 下载( ...
- HDU5437 Alisha’s Party (优先队列 + 模拟)
Alisha’s Party Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 用 oracle vitual box 克隆虚拟机,找不到eth0的解决方案
用 oracle vitual box 克隆虚拟机 当我们需要使用多台虚拟机的时候,如果一台一台的安装,实在是太过麻烦了.所以一般的虚拟机软件都为我们提供了克隆已有虚拟机状态的功能.Oracle vi ...
- 本地无sqlserver服务下操作数据库 之GSQL
作为程序员无论是我们写的各种MIS系统还是游戏都离不开数据的存取操作,正如我们前几天在VS下做的一MIS系统,现在纠结. 如果是C/S或B/S模型就好了,可是需求不是,没办法,顾客是上帝...他们的需 ...
- linux下Mysql 的安装、配置、数据导入导出
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),虽然功能未必很强大,但因它的免费开源而广受欢迎. 这次,接着上一篇<CentOs minimal安装和开发环境部署>,讲下L ...
- js库开发--参数传递及方法修改
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- dojo事件
dojo.connect 和 dojo.disconnect /*建立连接*/ dojo.connect(/*Object|null*/ obj, /*String*/ event, /*Object ...
- 【.NetRemoting-2】2015.09.17
[Remoting架构] [1]是.NetFramework的一个重要组成 [2]框架的两个重要特性 [A]基本实现[B]可扩展/可定制 [各个组成部分] [1][客户端,客户端应用程序域] [组成] ...
- sql 函数 总结
聚合函数 Avg(numeric_expr)返回integer.decimal.money.float---返回组中各值的平均值 Count(*|column_name|distinct column ...
- GoEasy实现web实时推送过程中的自动补发功能
熟悉GoEasy推送的朋友都知道GoEasy推送实现web实时推送并且能够非常准确稳定地将信息推送到客户端.在后台功能中查看接收信息详情时,可有谁注意到有时候在发送记录里有一个红色的R标志?R又代表的 ...