NSProxy使用笔记

1.多层集成,一个类继承多个类,使它同时拥有两个类的属性和方法,但是oc不支持多重继承,但是这里可使用NSProxy的消息转发机制让他调用其他类的方法.

使用NSProxy实现代理

学习的博文地址:http://blog.csdn.net/onlyou930/article/details/7548476

个人觉得这功能没有具体的价值,还不直接使用代理

2. 个人使用笔记,使用NSProxy实现消息(方法)的拦截,可以实现方法的转换,具体有什么使用价值还没有发现.只是现在的项目中用到了这样的一段代码.外面直接传一个类名进来,然后同时调用协议方法,然后截取协议方法名作为网络请求的url,然后让这个方法跳转到网络请求方法中去.

 

我们如果需要使用它可以继承自他,然后必须实现以下两个方法

//instanceMethodSignatureForSelector :

//返回一个NSMethodSignature对象,里面记录了方法的参数类型和返回值

//仅仅是记录,最后还是又下一个forward方法决定使用哪个方法

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

{

    SEL eSelector = @selector(postRequestWithURL::);//获取这个方法的实现地址

    

    NSMethodSignature *sign = [[self.handler class]instanceMethodSignatureForSelector:eSelector];

    //这里如果没有就调用父类的这个方法,返回父类的,不然或抛出异常

    return sign;

}

 

/**

 *   invocation传递给真的代理对象

 *

 *  @param invocation 是用来对象之间或是程序之间存储和发送信息,里面放置了那个对象调用那个函数,需要的参数

 */

- (void)forwardInvocation:(NSInvocation *)invocation

{

    /* 获取方法名 */

    NSString *selectorName = [self getNameFromSelector:invocation.selector];//自己写的方法,调试用的

    //拼接url : http://192.168.1.252:81/Member/login

    NSString *url = [NSString stringWithFormat:@"http://%@/%@/%@",self.baseUrl,self.className,selectorName];

    

    

    /* 方法跳转 */

    

    //设置调用者也,在这里设置的是self.hander

    [invocation setTarget:self.handler];

    //设置调用的方法

    [invocation setSelector:@selector(postRequestWithURL::)];

    //如果此消息有参数需要传入,那么就需要按照如下方法进行参数设置,需要注意的是,atIndex的下标必须从2开始。原因为:0 1 两个参数已经被target selector占用

    [invocation setArgument:&url atIndex:3];

    //retain 所有参数,防止参数被释放dealloc

    [invocation retainArguments];

    //消息调用

    [invocation invoke];

    return;

}

转载于:https://www.cnblogs.com/dlx-Blog/p/4425501.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值