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;
}