美文网首页iOS开发- Runtime
runtime消息转发机制

runtime消息转发机制

作者: 海牛骑士 | 来源:发表于2018-04-14 21:19 被阅读67次

    消息转发机制基本上分为三个步骤: 

    1. 动态方法解析 2. 备用接收者 3. 完整转发 

    我们可以通过控制这三个步骤其中一环来解决这一个问题

    特别注意:如果是正常类的消息,是不会走到这三个步骤的。所以走到这三个不步骤的前提条件已经确定该消息为未知消息

    1.动态方法解析

    新建一个person类并给person类添加一个方法

    #import

    @interface Person : NSObject

    //方法

    -(void)sendMessage:(NSString*)message;

    @end

    .m文件简单去实现一下

    //实现

    -(void)sendMessage:(NSString*)message

    {

        NSLog(@"大家好才是真的好oooooooooõ,%@",message);

    }

    我们将该类导入视图控制器中 调用 

    我们调用了sendMessage: 并随便添加了一个Person类中没有声明和实现的boy: 

    这个时候会出现第一个方法控制台打印正常 ,第二个控制台显示未找到该方法而程序出现崩溃。

    这个时候我们怎么去处理这个异常呢,我们就要用到了runtime消息转发 先在person类中倒入<objc/runtime>

    进行动态方法解析

    重载+(BOOL)resolveInstanceMethod:(SEL)sel方法

    //runtime环境下重载

    动态方法解析之后再

    运行就 不会发生崩溃

    2.备用接收者

    当我们动态方法解析也无法处理这个消息的时候(注释动态方法解析) 我们就要调用备用接受者

    -(id)forwardingTargetForSelector:(SEL)aSelector

    新建一个gender类并添加了一个boy:的方法对象实现

    在person类中实现如下 

    这个时候我们发现备用消息处理成功 程序也没有出现cash 控制台打印如下

    3.启用完整转发 

    当我们备用接收者也无法处理该消息的时候,我们就必须走完整转发流程(备注:完整转发对性能消耗很大)

    启用完整消息转发 -(void)forwardInvocation:(NSInvocation*)anInvocation

    首先进行方法签名调用-(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector方法

    进过完整消息转发这一步成功 控制台打印  成功完成消息转发

    当所有的都不能解决

    //全部消息都无法转发的话  就调用

    //-(void)doesNotRecognizeSelector:(SEL)aSelector

    //{

    //    NSLog(@"此消息无法处理");

    //}

    小结:这就是runtime消息转发  开始用打开runtime 的大门

    相关文章

      网友评论

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

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