NSProxy其实这个类可以称之为基类,这个类的属性和方法都很少,利用这个类可以实现我们的代理模式,我们也可以用它来实现一个"多继承",当然这个多继承不可能像C++,java那样,而是通过一个消息转发机制来实现的。我们可以用它来做一下消息转发。来模拟下代理的实现。
首先创建一个抽象类继承自NSProxy,在这个抽象类中我们有代理属性delegate,然后在这个抽象类中我们实现了两个方法做了相应的处理
/方法签名
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
//如果代理能进行这个消息的处理,就把这个方法的签名给返回去
if([self.delegate respondsToSelector:sel])
{
return [self.delegate methodSignatureForSelector:sel];
}
else
{
AbstarctSpam * spam = [AbstarctSpam sharedInstance];
return [spam methodSignatureForSelector:NSSelectorFromString(@"dealTrashMessage")];
}
}
//配发消息
- (void)forwardInvocation:(NSInvocation *)invocation
{
//获取方法
SEL selector = [invocation selector];
//进行判断代理能否去响应
if([self.delegate respondsToSelector:selector])
{
//去设置让代理去访问
[invocation setTarget:self.delegate];
//去派发消息
[invocation invoke];
}
//就是去处理没有响应的方法
else
{
invocation.selector=NSSelectorFromString(@"dealTrashMessage");
AbstarctSpam * spam = [AbstarctSpam sharedInstance];
[invocation setTarget:spam];
//方法调用
[invocation invoke];
}
}
这里的AbstractSpam就是专门用来处理代理不能响应的消息,在里面我们设置了一个单例,然后设置了一个处理的方法。然后之后我们去创建一个类去继承自我们之前定义的那个抽象的proxy类,去实现相应的代理方法
#import "AbstractProxy.h"
#import "ZXProtocol.h"
@interface contentProxy : AbstractProxy<ZXProtocol>
@end
然后我们在控制器当中就可以这么使用,这样子如果控制器可以响应sendMessage这个方法,那么消息就转发到了控制器让控制器去调用这个方法。
- (void)viewDidLoad {
[super viewDidLoad];
contentProxy * proxy = [contentProxy alloc];
proxy.delegate=self;
[proxy sendMessage];
}
-(void)sendMessage
{
NSLog(@"hhhh");
}
输出结果如下
补充下: instancesRespondToSelector:是类去调用判断实例方法是否存在.和respondsToSelector:如果是类调用就是去判断类方法是否存在,如果是实例变量调用就是去判断实例方法是否存在.