美文网首页
iOS消息转发机制

iOS消息转发机制

作者: 羞涩的老湿鸡 | 来源:发表于2019-04-26 11:14 被阅读0次

在iOS日常开发过程中,当我们所调用的方法不存在时,便会报这样一个异常错误。unrecognized selector sent to instance 0x000f0203ce

这种异常是由于我们没有去实现调用的方法造成的。解决方式也很简单,只要在对应的类或者其父类中添加相应的方法即可。而我们今天要讲的是另外一种解决方式。

iOS的消息转发


我们都知道iOS由于runtime机制的原因是一门动态运行时语言。因此我们可以在运行期间增加方法。

消息的动态转发机制分为三大步:

第一步:当我们所调用的方法不存在时,首先检测是否可以通过runtime动态添加方法,因此会先去调用以下方法。
+ (BOOL)resolveInstanceMethod:(SEL)sel;//通过对象调用则触发该方法
+ (BOOL)resolveClassMethod:(SEL)sel;//通过类方法调用则触发该方法

通过重写resolveInstanceMethod方法,使用class_addMethod动态添加方法
+(BOOL)resolveInstanceMethod:(SEL)sel {
     NSString *methodStr = NSStringFromSelector(sel);
     if ([methodStr isEqualToString:@"test:"]) {
        IMP timer = [[self class] instanceMethodForSelector:@selector(timerStart)];
        class_addMethod(self, sel, timer, "v@i");
        return YES;
     }
     return NO;

第二步:如果未能通过runtime动态添加方法,则会去询问是否可以通过其它类来解决该问题。询问时会自动调用以下方法。
- (id)forwardingTargetForSelector:(SEL)aSelector;

通过重写forwardingTargetForSelector方法,当test:方法在本类无法处理时,可交给BaseViewController类来进行处理。
- (id)forwardingTargetForSelector:(SEL)aSelector{
     NSString *seletorString = NSStringFromSelector(aSelector);
     if ([@"test:" isEqualToString:seletorString]) {
     BaseViewController *s = [[BaseViewController alloc] init];
     return s;
 }
     return [super forwardingTargetForSelector:aSelector];
 }

相关文章

  • runtime系列文章总结

    《iOS Runtime详解(消息机制,类元对象,缓存机制,消息转发)》《消息转发机制与Aspects源码解析》《...

  • iOS理解Objective-C中消息转发机制附Demo

    iOS理解Objective-C中消息转发机制附Demo iOS理解Objective-C中消息转发机制附Demo

  • iOS面试-基础

    [toc] Runloop AutoReleasePool 多线程 响应者链 消息响应机制 消息转发机制 iOS内...

  • iOS 消息转发机制

    今天大概学习了下iOS的消息转发机制,还是挺有收获,在此做下笔记,以便后面温习。 1.iOS的消息转发机制原理如下...

  • iOS面试题总结(二)

    iOS面试题(二) 消息发送和转发机制,SEL和IMP 消息发送转载自黄龙辉消息发送和消息转发机制 在Object...

  • Runtime

    相关简单介绍 消息机制消息传递机制消息转发机制-动态添加方法消息转发机制-快速转发消息转发机制-慢速转发消息转发机...

  • iOS - 消息转发机制

    我们知道,OC是动态语言,所有的方法都会以消息的形式传递给对象,对象会根据方法的类型来进行实例方法或者类方法的选择...

  • 【iOS】消息转发机制

    1、动态方法解析 对象在收到无法处理的消息时,会调用下面的方法,前者是调用类方法时会调用,后者是调用对象方法时会调...

  • iOS消息转发机制

    OC消息转发 oc中的调用对象或者类不存在的方法,会执行一遍消息转发流程.消息转发主要包括4步 首先调用+ (BO...

  • iOS 消息转发机制

    iOS开发过程中我们经常会碰到这样的报错:unrecognized selector sent to instan...

网友评论

      本文标题:iOS消息转发机制

      本文链接:https://www.haomeiwen.com/subject/xzoxnqtx.html