Implementation is Not Found(找不到实现方法时)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
使用明确的类型定义的对象,编译器知道该对象是否可以响应某些消息,因为对象的类型非常明确。如下代码:
SomeClass *anObject; // 定义了一个SomeClass类的对象: anObject
anObject = [[SomeClass alloc] init];//为anObject分配内存空间并初试话这个对象
[anObject alert: additionalObject]; //如果alert:方法没有在SomeClass类中声明或者在SomeClass的所有父类中声明的话,编译器会给出一个警告
但是,如下这种情况下,编译器不会给你警告:
id anObject; //id类型的对象,也就是任意类型的对象anObject;
anObject = [[SomeClass alloc] init]; // 分配空间并初试话anObject
[anObject alert: additionalObject]; // 编译器不知道anObject是哪个类的,所以无法知道anObject能否相应alert:这个消息。
上面的代码,编译器不会给出一个警告,因为编译器只知道anObject是id类型的对象,它也不知道anObject是哪个类的,也就不知道anObject能响应什么消息了。
那么如果在运行时,Objective-C的run-time库最终也没找到alert:这个方法的实现呢?当然就会抛出一个异常了!有两种方法可以解决这个问题:
1.利用@selector做一个是否实现了某个方法的检查,代码如下:
if ([anObject respondsToSelector: @selector(alert:)] == YES)
{
[anObject alert: additionalObject]; // 实现了这个方法,调用它就好了.
}
else
{
// 没实现alert:方法,可以做一些其它该做的事情
}
2.将这个消息转发给其它对象(下面一节我们来学习转发)。
在线练习
{$ activeFileHint $}