消息转发过程
1.动态方法解析 @dynamic 实现setter getter声明, 动态添加一个方法
resolveInstanceMethod:
2.快速消息转发
forwardingTargetForSelector:
3.标准消息转发
methodSignatureForSelector:
forwardInvocation:
- (
NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSLog(
@"%s %@",__func__,
NSStringFromSelector(aSelector));
if(aSelector ==
@selector(eat)) {
return [
NSMethodSignature signatureWithObjCTypes:
"v@:"]; }
return [
super methodSignatureForSelector:aSelector];}- (
void)forwardInvocation:(
NSInvocation *)anInvocation{
NSLog(
@"%s",__func__); SEL selector = [anInvocation selector]; Pig *pig = [Pig new];
if([pig respondsToSelector:selector]) { [anInvocation invokeWithTarget:pig]; }}
作者:壁虎尾巴
链接:https://www.jianshu.com/p/ad3791a2add0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- (
NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSLog(
@"%s %@",__func__,
NSStringFromSelector(aSelector));
if(aSelector ==
@selector(eat)) {
return [
NSMethodSignature signatureWithObjCTypes:
"v@:"]; }
return [
super methodSignatureForSelector:aSelector];}
作者:壁虎尾巴
链接:https://www.jianshu.com/p/ad3791a2add0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { NSLog(@"%s %@",__func__,NSStringFromSelector(aSelector)); if(aSelector == @selector(eat)) { return [NSMethodSignature signatureWithObjCTypes:"v@:"]; } return [super methodSignatureForSelector:aSelector]; } - (void)forwardInvocation:(NSInvocation *)anInvocation { NSLog(@"%s",__func__); SEL selector = [anInvocation selector]; Pig *pig = [Pig new]; if([pig respondsToSelector:selector]) { [anInvocation invokeWithTarget:pig]; } }要说明的是
"v@:"
,每个方法会有两个默认值,一个是
self
和
_cmd
, 表示方法的拥有者和SEL, 签名类型就是描述这个方法的参数和返回值的
其中
v
表示
void
,
@
表示
self
,
:
表示
_cmd
- (
NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSLog(
@"%s %@",__func__,
NSStringFromSelector(aSelector));
if(aSelector ==
@selector(eat)) {
return [
NSMethodSignature signatureWithObjCTypes:
"v@:"]; }
return [
super methodSignatureForSelector:aSelector];}- (
void)forwardInvocation:(
NSInvocation *)anInvocation{
NSLog(
@"%s",__func__); SEL selector = [anInvocation selector]; Pig *pig = [Pig new];
if([pig respondsToSelector:selector]) { [anInvocation invokeWithTarget:pig]; }}
作者:壁虎尾巴
链接:https://www.jianshu.com/p/ad3791a2add0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- (
NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSLog(
@"%s %@",__func__,
NSStringFromSelector(aSelector));
if(aSelector ==
@selector(eat)) {
return [
NSMethodSignature signatureWithObjCTypes:
"v@:"]; }
return [
super methodSignatureForSelector:aSelector];}- (
void)forwardInvocation:(
NSInvocation *)anInvocation{
NSLog(
@"%s",__func__); SEL selector = [anInvocation selector]; Pig *pig = [Pig new];
if([pig respondsToSelector:selector]) { [anInvocation invokeWithTarget:pig]; }}
作者:壁虎尾巴
链接:https://www.jianshu.com/p/ad3791a2add0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业要说明的是
"v@:"
,每个方法会有两个默认值,一个是
self
和
_cmd
, 表示方法的拥有者和SEL, 签名类型就是描述这个方法的参数和返回