xcode编译时报unrecognized selector的异常

当调用对象上某个方法,而该对象上没有实现这个方法的时候,可以通过“消息转发”进行解决。

objc在向一个对象发送消息时,runtime会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行。如果在最底层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to xxx。但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会:

1、Method resolution

objc运行时回调用+resolveInstanceMethod:或者+resolveClassMethod:,让你有机会提供一个函数实现。如果添加了函数,那运行时系统会重新启动一次消息发送的过程,否则,运行时就会已到下一步,消息转发(Message Forwarding)。

2、Fast forwarding

如果目标对象实现了-forwardingTargetForSelector:,runtime这时候会调用这个方法,给你把这个消息转发给其他对象的机会,只要这个方法返回的不是nil或self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象,否则,就会继续Normal Forwarding。这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但是下一步转发会创建一个NSInvocation对象,所以相对更快点。

3、Normal forwarding

这一步是runtime最后一次挽救机会,首先发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil。runtime则会发出doseNotRecognizeSelector:消息,程序这时挂掉。如果返回了一个函数签名,runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值