博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSProxy使用笔记
阅读量:5065 次
发布时间:2019-06-12

本文共 1519 字,大约阅读时间需要 5 分钟。

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 :

    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

你可能感兴趣的文章
2011年12月09日
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
IOS-图片操作集合
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
泛型第23条:请不要在新代码中使用原生态类型
查看>>
从下周开始就要采用网上记录值班日志了
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
【AppScan心得】IBM Rational AppScan 无法记录登录序列
查看>>
[翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
查看>>
简化通知中心的使用
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
html 简介
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
选择器
查看>>
Mysql与Oracle 的对比
查看>>
idea的maven项目无法引入junit
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>