多态可以使不同类之间定义相同名字的方法。
动态类型是指在程序运行期间判断对象类型。
动态绑定是指在运行期间判断调用某对象的具体方法。
Dynamic Binding and the id Type
id类型的作用其实是能在运行期存储任何类型的对象。
它的用法如下图所示:
Compile Time Versus Runtime Checking
The id Data Type and Static Typing
id类型变量不能使用点操作符。
Argument and Return Types with Dynamic Typing
就是说方法的参数和返回值也可以是id类型的。
不同的类之间可以有同名的方法,但是一定要确保各方法参数的类型都是一致的,返回值的类型也是一致的。拿返回值来说,要么你都是对象类型,要么都是同一内置类型,不然编译器就会发出警告,参数类型亦然。
对象类型之间可以不同,因为说到底它们之间传递的是指针,所以与具体的类型无关。
书中关于这一点说的比较少,我的理解也不一定全面。
Asking Questions about Classes
表9.1列举了一些用于判断动态类型的方法。
你可以用[类名 class]直接获取一个无名对象实例。
你还可以通过[对象名 class]获取该对象所属的类型名。
判断两个对象类型是否相同,你可以用如下方式:
如果是使用动态类型的判断方法的话可以如下使用:
这条语句的作用就是判断myFract是不是Fraction类的对象。不知道怎么,我看着写法就是有些别扭,这个myFract不是返回值,而是一个对象,isMemberOfClass是这个对象的方法,[Fraction class]是参数。
@selector指令
书中对该指令轻描淡写,也没有这一节,这是我对网上资料的理解。
它相当于取每个方法的编号,有点像函数指针的意思,它返回一个SEL类型的值,不同的方法返回的SEL值也不同。
其用法如下所示:
你可以这样用:
你也可以这样用:
这个判断对该对象的各父类也是成立的,即,如果draw方法不在graphicObject中而在他的父类或者更高层的类中判断的结果也是一样的——该对象可以调用该方法(YES)。
这里面初步涉及到了托管(delegation)的概念。从书中的简单描述来看,托管就是一个中间层,它连接了某一事件和处理该事件的若干各方法。
Exception Handling Using @try
这就是Objective-C中的异常处理,如下图所示:
除此之外还有@finally和@throw,前者作为在异常处理中最后肯定被执行的语句块而存在,后者可以指定你想抛出的异常。
同样Objective-C也允许多个catch块的出现。
和C++语言一样,尽量不要用异常处理,能检查出来的错误必须要检查出来,实在没办法再用异常来结束程序。