ios开发-NSProxy

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

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

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

#import 
@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)