作用:与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"];