如果一个对象收到一个消息调用一个它未定义的方法那么会引起一个错误。这和调用一个不存在的方法有些相似。但是由于发送消息是在运行时进行的,所以这些错误经常只有到程序实际运行时才会暴露出来。
当消息的选择器是一个常量并且知道接收者的类型时,这种错误相对容易避免。例如,自己写了一个程序,当然能够确定接收者能够响应什么。如果接收者是静态类型,编译器会替完成校验。
但是,如果消息选择器或者接收者的类型是可变的,这种校验就只能到运行时才能进行。NSObject类中定义的respondsToSelector:方法可以检验一个接收者是否可以响应一个消息。它把方法选择器作为参数,并且返回接收者是否有一个与选择器相匹配的方法。
if ( [anObject respondsToSelector:@selector(setOrigin::)] ) [anObject setOrigin:0.0 :0.0]; else fprintf(stderr, "%s can't be placed\n", [NSStringFromClass([anObject class]) UTF8String]);
当向一个对象发送消息,但是这个对象在编译时不能完全控制时,respondsToSelector:校验就显得特别重要。例如,有的代码会根据一个变量向一个对象发送消息来运行不同的方法,就需要确保接收者实现了需要运行的方法。