什么时候会报unrecognized selector异常?
作者:
baby_在海边 | 来源:发表于
2018-07-23 16:06 被阅读0次
- 当调用对象(子类,各级父类)不含有对应方法的时候,并且依旧没有给出消息转发的具体方案的时候,程序运行时会crash并抛出unrecognized selector异常.
- objective-c中的每个方法在运行时会被转化为消息发送objc_msgSend(reciver, selector)
- 运行时会根据对象(reciever) 的isa指针找到该对象所对应的类,然后依次在对应的类,父类,父类的父类根类中找对应的方法
2.下面讲述对象发放的解析过程
- 第一步:+(BOOL)resolveInstanceMethod:(SEL)sel实现方法,指定动态的添加方法.若返回NO,则进入下一步,若返回YES,则通过class_addMethod函数动态的添加方法,消息得到处理,此流程处理完毕.
- 第二步:在第一步返回NO的时候进入,(id)forwardingTargetForSelector:(SEL)aSelector方法,这是运行时给我的第二次机会,用于指定那个对象响应这个Selector,不能指定self,若返回nil,则表示不处理,进入下一步,若返回某个对象,则会调用改对象的方法.
*第三部:我们首先要通过- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector指定方法签名,若返回nil,则不处理,返回方法签名则会进入下一步
- 第四步: 调用(void)forwardInvocation:(NSInvocation *)anInvocation方法,我们可以通过anInvocation做处理,重定向
- 第五步:若没有实现- (void)forwardInvocation:(NSInvocation *)anInvocation,那么会进入- (void)doesNotRecognizeSelector:(SEL)aSelector,没有实现,则crash
本文标题:什么时候会报unrecognized selector异常?
本文链接:https://www.haomeiwen.com/subject/uhazpftx.html
网友评论