【编辑推荐】
- Android源码下载:QQ第三方登录demo
- Android源码:浏览器应用 adnroid webview demo
- Android源码下载:屏幕画笔Demo
- 一个Demo展示Storyboard的强大年夜
- 小Demo大年夜常识-经由过程控制Button仪羁啻进修Android坐标
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散
假设说我们声明一个类, 初始化对象, 并且在词攀类声明一个办法, 调用办法的时刻底层是怎么处理的呢? 今天我们来简单模仿测试, 来看事理产生了什么
以下是调用办法处理的筹划图, 按照筹划次序去处理

以下是体系办法
- //消息转发
- //- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
- //标准的消息转发
- //- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE("");
- //- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");
- //
- //动态办法解析
- //+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
- //+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
Demo解析
创建类, Person类, 声明办法, 并且在ViewController进行初始化调用
- VC中
- Person *person = [Person new];
- [person run];
- Person类中
- - (void)run;//没有实现
此时运行是不是会报错呢? 就是这个常见的缺点
“ - [Person run]: unrecognized selector sent to instance 0x600000008310’ “
那么如许做到底产生了什么? 做了哪些工作? 我们一步步来分析
动态测试
在Presenter类中, 写动态办法
- + (BOOL)resolveInstanceMethod:(SEL)sel{
- NSLog(@"sel = %@",NSStringFromSelector(sel));
- return [super resolveInstanceMethod:sel];
- }
再次运行Demo就会走到这个办法中, 也就是我们所指的筹划1, 此时打印出来的scl为” 消息转发机制Demo[41829:4186268] sel = run “
- + (BOOL)resolveInstanceMethod:(SEL)sel{
- NSLog(@"sel = %@",NSStringFromSelector(sel));
- //1.断定没有实现办法, 那么我们就是动态添加一个办法
- if (sel == @selector(run:)) {
- class_addMethod(self, sel, (IMP)newRun, "v@:@:");
- return YES;
- }
- return [super resolveInstanceMethod:sel];
- }
- void newRun(id self,SEL sel,NSString *str) {
- NSLog(@"---runok---%@",str);
- }
温馨小提示, 动态添加办法参数意译 : //将要添加办法的类/sel名/IMP函数指针<添加函数>, 官方文档其实是有解释的
此时我们再次运行, 那么打印结不雅就来了” 消息转发机制Demo[43269:4212899] —runok—ok跑 “, 如许的话我们就解决掉落了报错这个问题
消息转发重定向测试
此时我们新创建一个类Mbxb, 此时我们照样从新写一个同名字的办法run办法, 并且进行实现
- - (void)run{
- NSLog(@"---Mbxbrunok---");
- }
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 您企业的营业经由过程异步备份便可以或许获得支撑,抑>>>详细阅读
本文标题:iOS消息转发机制Demo解析
地址:http://www.17bianji.com/lsqh/39877.html
1/2 1