美文网首页
ios开发-NSProxy

ios开发-NSProxy

作者: 不写昵称 | 来源:发表于2018-08-28 22:07 被阅读0次

    作用:与NSObject属同一个级别,负责将消息转发到真正的target的代理类,实现类似于多继承的功能。

    打个比方
    你想要买一件二手物品,但是你并不想直接跟卖家接触(直接向target发消息),这时你去找了一个第三方,你告诉这个第三方你要买什么、出多少钱买、什么时候要等(向代理发消息),第三方再去跟卖家接触并把这些信息转告卖家(转发消息给真实的target),最后通过第三方去完成这个交易。
    几乎可以模拟任何类, 模拟A类,则可以调用A类的方法,模拟B类,则可以调用B类的方法。如果模拟的类没有对应的方法,执行时就会崩溃

    使用
    创建NSProxy的子类
    .h文件

    #import <Foundation/Foundation.h>
    @interface HCDNSProxy : NSProxy
    //模拟的对象
    - (void)transformObject:(NSObject *)object;
    @end
    

    .m文件

    #import "HCDNSProxy.h"
    
    @implementation HCDNSProxy
    {
        NSObject *transformObject;
    }
    
    //需要模拟的对象
    - (void)transformObject:(NSObject *)object {
        transformObject = object;
    }
    
    //执行方法
    - (void)forwardInvocation:(NSInvocation *)invocation {
        SEL selector = invocation.selector;
        
        if ([transformObject respondsToSelector:selector]) {
            [invocation invokeWithTarget:transformObject];
        } else {
            [super forwardInvocation:invocation];
        }
    }
    
    //查询方法签名
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
        
        if ([transformObject respondsToSelector:sel]) {
            return [transformObject methodSignatureForSelector:sel];
        } else {
            return [super  methodSignatureForSelector:sel];
        }
    }
    
    调用
        //创建proxy
        HCDNSProxy *proxy = [HCDNSProxy alloc];
        //模拟APPDelegate类
        [proxy transformObject:[UIApplication sharedApplication].delegate];
        //执行APPDelegate类中的方法
        [proxy performSelector:@selector(test)];
        //模拟ViewController类
        [proxy transformObject:self];
        //执行ViewController中的方法
        [proxy performSelector:@selector(doSomething:andLink2:) withObject:@"hello" withObject:@"world"];
    

    相关文章

      网友评论

          本文标题:ios开发-NSProxy

          本文链接:https://www.haomeiwen.com/subject/jercwftx.html