"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. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台: ...

  2. 逐渐深入地理解Ajax

    Ajax的基本原理是:XMLHttpRequest对象(简称XHR对象),XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.能够以异步方式从服务器获得更多信息.意味着用户不必刷新页面也能取得新 ...

  3. HDU 1559 最大子矩阵 (DP)

    题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...

  4. Linux以及Android开发中的小技巧和长繁命令记录收集

    不断更新收集中.... 201407161654 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080port建立 ...

  5. struts2 action重定向

    struts2的结果类型: <action name="loginAction" class="com.itheima.action.LoginAction&quo ...

  6. 一个非常给力的播放器video-js

    video-js采用的是html5播放器. 在不支持html5的浏览器会自动切换成flash. video-js的官网http://www.videojs.com/ 看看下载的demo就知道个大概了. ...

  7. R - 递推

    Description          我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平 ...

  8. linux学习笔记之硬盘分区

    引用:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/03/2997098.html PS:本文仅对知识点作总结.详情请参考原文. 首先 ...

  9. oracle中导出导入表以及数据

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中.利用 ...

  10. 纯css改变下拉列表select框的默认样式

    下列CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下* ...