解析
此时有两个同样的办法, 我们从新在Person类中
声明函数
来实现办法
此时运行测试, 动态测试输出” 消息转发机制Demo[45875:4255869] sel = run “, 消息转发重定向输出” 消息转发机制Demo[45875:4255869] —Mbxbrunok— “, 同样也可以找见办法run
当我们进行处理
- - (id)forwardingTargetForSelector:(SEL)aSelector{
- NSLog(@"aSelector = %@",NSStringFromSelector(aSelector));
- return [[Mbxb alloc]init];
- }
那么此时运行成功输出, “ —Mbxbrunok— “
生成办法签名转发消息
基本步调
此时我们在Person类中, 生成办法签名
拿到签名
- - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""){
- NSLog(@"---%@---",anInvocation);
- return [super forwardInvocation:anInvocation];
- }
此时我们的po的签名输出为” return value: {v} void target: {@} 0x600000016ba0 selector: {:} run “
拿到消息转发签名
- - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""){
- NSLog(@"---%@---",anInvocation);
- //取到消息
- SEL seletor = [anInvocation selector];
- //转发
- Mbxb *bxb = [[Mbxb alloc]init];
- if([bxb respondsToSelector:seletor]){
- //调用对象,进行缀发
- [anInvocation invokeWithTarget:bxb];
- }else{
- return [super forwardInvocation:anInvocation];
- }
- }
小细节: 抛出异常
- - (id)forwardingTargetForSelector:(SEL)aSelector{
- NSLog(@"aSelector = %@",NSStringFromSelector(aSelector));
- return [super forwardingTargetForSelector:aSelector];
- }
假如说我们没有这个办法, 同样是碰到会崩溃的问题
我们这里来进行一个异常处理
- - (void)doesNotRecognizeSelector:(SEL)aSelector{
- NSString *selStr = NSStringFromSelector(aSelector);
- NSLog(@"%@不存在",selStr);
- }
解析模仿
- - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""){
- //转化字符
- NSString *sel = NSStringFromSelector(aSelector);
- //断定, 手动生成签名
- if([sel isEqualToString:@"run"]){
- return [NSMethodSignature signatureWithObjCTypes:"v@:"];
- }else{
- return [super methodSignatureForSelector:aSelector];
- }
我们可以在这个异常处理一一些处理, 比如说弹框
总结
推荐阅读 开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散
您企业的营业经由过程异步备份便可以或许获得支撑,抑>>>详细阅读 本文标题:iOS消息转发机制Demo解析 地址:http://www.17bianji.com/lsqh/39877.html 1/2 1