2. 消息转发
- + (BOOL)resolveInstanceMethod:(SEL)sel
//实例方法的处理 - +
(BOOL)resolveClassMethod:(SEL)sel
//类方法的处理
- - (id)forwardingTargetForSelec
tor:(SEL)aSelector
- - (NSMethodSignature
*)methodSignatureForSelect
or:(SEL)aSelector; /实例方法的处理 - + (NSMethodSignature
*)instanceMethodSignatureF
orSelector:(SEL)aSelecto //类方法的处理 - - (void)forwardInvocation:(NSInvocation *)anInvocation;
}
- - (NSMethodSignature
*)methodSignatureForSelect
or:(SEL)aSelector; /实例方法的处理 - + (NSMethodSignature
*)instanceMethodSignatureF
orSelector:(SEL)aSelecto //类方法的处理 - - (void)forwardInvocation:(NSInvocation *)anInvocation;
- 先调用生成一个方法签名,然后此方法签名给forwardInvocation函数使用,开头我们要找的错误unrecognized
selector sent to
instance原因,原来就是因为methodSignatureForSelect
or这个方法中,由于没有找到run对应的实现方法,所以返回了一个空的方法签名,然后在forwardInvocation中就产生崩溃了
方法声明
虽然上述机制可以转发当前类中没有实现的方法,但发送消息时仍然需要知道每个消息的方法签名,否则就会有编译器告警。可以通过category来声明转发消息的方法
参考:http://www.jianshu.com/p/1bde36ad9938