当我们给一个对象发送一条消息,而这个对象又不能处理这条消息,此时就会导致报错。然而在报错之前我们使用runtime有两种解决方案。
方法动态实现
我前一篇说过OC消息发送机制,当对象在本类以及父类里面都找不到对应的方法实现的时候,此时系统会调用 resolveInstanceMethod:或者resolveClassMethod: 方法,让开发者有机会动态实现相应的方法,或者做一些其他的操作。我们看一下代码实现
我们在viewcontroller里面调用Test类的实例方法resolveThisMethodDynamically,但是Test类里面并没有这个方法,此时系统调用resolveInstanceMethod:方法,IMP是指向方法实现的指针,通过这样我们就能避免系统奔溃出错,动态实现方法选择器与方法实现的内存地址绑定。
消息转发
如果我们对一个对象发送一个无法处理的消息,也没有做动态实现系统就会调用 -(id)forwardingTargetForSelector:(SEL)aSelector该方法把消息发送给对应的对象,代码实现如下: