ios-NSProxy

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:如果是类调用就是去判断类方法是否存在,如果是实例变量调用就是去判断实例方法是否存在.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值