美文网首页
iOS消息转发

iOS消息转发

作者: Trigger_o | 来源:发表于2018-09-20 18:08 被阅读0次

类对象在接收到无法解读的消息时,会出现unrecognized selector sent to instance的crash

unrecognize selector崩溃

例如这种情况:

WTPerson *p = [WTPerson new];

WTBird*bird = (WTBird*)p;

[bird fly];

WTBird 有一个fly的实例方法 而WTPerson是没有的.unrecognized selector也就是消息被发送给了不能处理它的对象。

我们可以在运行时做一些动作 来帮助对象处理这种无法解读的消息

1.通过重写+(BOOL)resolveInstanceMethod:(SEL)sel 或+(BOOL)resolveClassMethod:(SEL)sel方法(当消息方法是实例方法时调用前者,当消息方法为类方法时,调用后者),在其中对类使用用 class_addMethod 添加方法,以此防止crash。

当类遇到不能处理的消息时,会调用上面那两个方法,sel既不能响应的方法,也就是消息,这个方法返回一个bool值

2. 使用- (id)forwardingTargetForSelector:(SEL)aSelector方法,这个方法返回一个id类型,可以在此方法中,将未知消息传递给另一个类对象

3.方法-(void)forwardInvocation:(NSInvocation *)anInvocation,参数 anInvocation 中包含未处理消息的各种信息(selector\target\参数...)。在这个方法中,可以把 anInvocation 转发给多个对象. 在调用forwardInvocation:之前会调用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector方法来获取这个选择子的方法签名,然后在-(void)forwardInvocation:(NSInvocation *)anInvocation方法中你就可以通过anInvocation拿到相应信息做处理.


最后 如果仍然没能处理掉这个未知消息,则会调用NSObject 的-(void)doesNotRecognizeSelector:(SEL)aSelector方法.

相关文章

  • iOS 消息发送与转发详解

    iOS 消息发送与转发详解 iOS 消息发送与转发详解

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

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

  • runtime系列文章总结

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

  • iOS消息转发

    title: “iOS消息转发”date: 2016-03-22 13:48:38tags: 消息转发这块,我学习...

  • ios 消息转发

    ios在类中,没有定义的函数,要走消息转发流程。如果不走消息转发流程,程序会奔溃。消息转发流程分四步调用。 第一步...

  • iOS 消息转发

    有时候我们常常看到一个cash 信息,意思是这个对象不存在这个方法,你向这个对象发送消息就会crash。 我们除了...

  • iOS 消息转发

    消息转发是Objective-C运行时的一个重要特性,具体表现是当调用一个不存在的方法时,并不会立马Crash,R...

  • ios — 消息转发

    概念 首先我们需要简单了解下,什么是oc的消息以及oc中的消息转发。先看一段简单的代码 oc中调用方法就是向对象发...

  • iOS消息转发

    类对象在接收到无法解读的消息时,会出现unrecognized selector sent to instance...

  • iOS消息转发

    消息转发的前提 在对象收到无法解读的消息时会触发消息转发 消息转发的过程 I. resolveInstanceMe...

网友评论

      本文标题:iOS消息转发

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