"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:多态、动态类型和动态绑定的更多相关文章

  1. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  2. 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?

    转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...

  3. Objective-C路成魔【11-多态性、动态类型和动态绑定】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...

  4. Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。

    https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...

  5. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

    多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...

  6. C++中的动态类型与动态绑定、虚函数、运行时多态的实现

    动态类型与静态类型 静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型.静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变.通俗的讲,就是上下文无关,在编译时 ...

  7. objective-c系列-动态类型和动态绑定

    /* 静态类型: 变量的类型在编译之时就被确定下来. 动态类型: 对象的类型由对象的内存里的某个结构数据来决定它是什么类型, 而不是在编译之时就被确定下来的数据类型. 对象的类型只有在运行时才知道. ...

  8. C++基础知识:动态类型识别

    1.动态类型指的是基类指针所指向的对象的实际类型 2.C++中的多态根据实际的对象类型调用对应的虚函数(1)可以在基类中定义虚函数返回具体的类型信息(2)所有的派生类都必须实现类型相关的虚函数(3)每 ...

  9. Python基础系列讲解—动态类型语言的特点

    前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...

随机推荐

  1. Java开发者工具

    From:http://www.csdn.net/article/2015-03-26/2824317 1. Notepad++ Notepad++是用于编辑xml.脚本以及记笔记的最佳工具.这个工具 ...

  2. Add Digits 解答

    Question Given a non-negative integer num, repeatedly add all its digits until the result has only o ...

  3. vector迭代器失效的一种情形

    使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例: 第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后 将原内存中的数据拷 ...

  4. ubuntu下hadoop完全分布式部署

    三台机器分别命名为: hadoop-master ip:192.168.0.25 hadoop-slave1 ip:192.168.0.26 hadoop-slave2 ip:192.168.0.27 ...

  5. MongoDBAuth

    1,mogoDB 认证登陆

  6. html5 laboratory - drawing in the canvas

    html5 laboratory - drawing in the canvas Creating a bar chart with canvas 21st February 2010 The exp ...

  7. java一个简单的管理系统

    用java实现的简单管理系统 运行出来的状态 实现了新增.删除.借出.归还.排行榜简单的功能! 下面是简单的代码 首先定义一个书籍类,自己打开哦! public class Book implemen ...

  8. Ffmpeg和SDL如何同步音频

    ong> 同步音頻 现在我们已经有了一个比较像样的播放器.所以让我们看一下还有哪些零碎的东西没处理.上次,我们掩饰了一点同步问题,也就是同步音频到视频而不是其它的同步方式.我们将采用和视频一样的 ...

  9. paip.c++ qt 目录遍历以及文件操作

    paip.c++ qt 目录遍历以及文件操作 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/a ...

  10. CentOS6.5下使用NetHogs监控进程网络使用情况

    Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于能够显示每一个进程的带宽占用情况,这样能够更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. ...