9-多态、动态类型和动态绑定

来源:互联网 发布:unity3d 昼夜交替 编辑:程序博客网 时间:2024/06/02 13:11

前几章参考:

1-引言

2-Objective-C 编程

3-类、对象和方法

4-数据类型和表达式

5-循环结构

6-选择结构

7-类

8-继承


多态这个其它语言也有。动态类型有类似的,但不完全相同。动态绑定别的语言也有类似,但没有objective-c用的这么多。


红色部分你就能看出这三个概念最终针对的是什么东西:

多态能够使来自不同类的对象定义相同名称的方法

动态类型能使程序直到执行时才确定对象所属的

动态绑定则能使程序直到执行时才确定实际要调用的对象方法


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

系统总是携带有关“一个对象属于哪个类”这样的信息。该信息能使系统在运行时做出这些关键性的决定,而不是在编译时。

使不同的类共享相同方法名称的能力称为多态。


动态绑定和id类型:

id dataValue;

变量dataValue被声明为id对象类型。因此,dataValue可用来保存程序中任何类型的对象。务必注意,声明中并没有使用星号。


id数据类型和静态类型:

不要养成滥用id这种通用数据类型的习惯。下面告诉你为什么要使用静态类型:

1)将一个变量定义为特定类的对象时,使用的是静态类型。“静态”指的是对存储在变量中对象的类型进行显示声明。这样存储在这种形态中的对象的类是预定义的,也就是静态的。使用静态类型时,编译尽可能确保变量的用法在程序中始终保持一致。编译器能够通过检查来确定应用于对象的方法是由该类定义的还是由该类继承的,否则它将显示警告信息。

2)使用静态类型的另一个原因是它能够提高程序的可读性。


动态类型的参数和返回类型:

如何使用动态类型来调用一个方法,需要注意如下规则:如果在多个类中实现名称相同的方法,那么每个方法都必须符合各个参数的类型和返回值类型。这样编译器才能为消息表达式生成正确的代码。编译器会对它所遇到的每个类声明执行一致性检查。

当一个方法选取对象作为它的参数,而另一个方法选取浮点数作为参数时,或者一个方法以对象作为返回值,而另一个以整型数作为返回值。编译器可能生成不正确的代码来向方法传递参数或处理返回值。


处理动态类型的方法:

  1. -(BOOL) isKindOf:class-object(判断对象是否是class-object或其子类的成员)  
  2. -(BOOL) isMenberOfClass:class-object(判断对象是否是class-object的成员)  
  3. -(BOOL) respondsToSelector:selector(判断对象是否能够响应selector所指定的方法)  
  4. +(BOOL) instancesRespondToSelector:selector(判断指定的类实例是否能响应selector所指定的方法)  
  5. +(BOOL) isSubclassOfClass:class-object(判断对象是否是指定类的子类)  
  6. -(id) performSelector:selector(应用selector指定的方法)  
  7. -(id) performSelector:selector withObject:object(应用selector指定的方法,传递参数object)  
  8.  -(id) performSelector:selector withObject:object1 withObject:object2(应用selector指定的方法,传递参数object1和object2

可以对一个方法名应用@selector指令。例如:@selector (alloc)为名为alloc的方法生成一个SEL类型的值,该方法是从NSObject类继承的。

记住,测试包含继承的方法,并不是只测试直接定义在类中的方法。

performSelector:方法和它的变体允许你向对象发送消息,这个消息可以是存储在变量中的selector。


在iOS中,respondsToSelector:方法广泛用于实现委托(delegation)的概念。为了让系统能够检查你确实实现了特定的方法,使用respondsToSelector:判断是否可以将事件的处理委托给你的方法。如果你没有实现这个方法,它会自己处理该事件,按定义的默认行为来执行。


@try

@catch

@finally

@throw

这些和java的或者其它语言差不多。Apple反对非必要的使用异常(谁都反对。哈哈)。



原创粉丝点击