NSProxy实现代理(消息转发)
来源:互联网 发布:万人赚软件下载 编辑:程序博客网 时间:2024/06/06 02:31
// MyProxy.h
#import <Foundation/Foundation.h>
@interface MyProxy : NSProxy {
NSObject *object;
}
- (id)transformToObject:(NSObject *)anObject;
@end
// MyProxy.m
#import "MyProxy.h"
@implementation MyProxy
- (void)dealloc
{
[object release];
object = nil;
[super dealloc];
}
- (void)fun
{
// Do someting virtual
// 先做一些代理工作,然后创建一个后台线程,在后台线程中再调用真正的[object fun];
}
// Stupid transform implementation just by assigning a passed in object as transformation target. You can write your factory here and use passed in object as id for object that need ot be created.
- (id)transformToObject:(NSObject *)anObject
{
if(object != anObject) {
[object release];
}
object = [anObject retain];
return object;
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
if (object != nil) {
[invocation setTarget:object];
[invocation invoke];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
NSMethodSignature *result;
if (object != nil) {
result = [object methodSignatureForSelector:sel];
} else {
// Will throw an exception as default implementation
result = [super methodSignatureForSelector:sel];
}
return result;
}
@end
// RealSubject.h
#import <Foundation/Foundation.h>
@implementation RealSubject : NSObject
- (void)fun;
@end
// RealSubject.m
#import "RealSubject.h"
@implementation RealSubject
- (void)fun
{
// 这个方法需要代理进行惰性调用
// Do something real
}
- (void)otherFun
{
// 这个方法不需要代理做任何处理,可直接被调用
// Do something real
}
@end
// main.m
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyProxy *myProxy = [MyProxy alloc];
RealSubject *realSub = [[RealSubject alloc] init];
[myProxy transformToObject:realSub];
[myProxy fun]; // 直接调用myProxy的fun,执行代理工作
[myProxy otherFun]; // 依次调用myProxy的methodSignatureForSelector和forwardInvocation转发给realSub,realSub调用otherFun
[realSubject release];
[myProxy release];
[pool release];
return 0;
}
注意,调用MyProxy中未定义的方法otherFun会出现'MyProxy' may not respond to 'fun'的警告,可通过使用私有范畴或通过performSelector:withObject:来避免,如果有更好的方法,请告知。
- NSProxy实现代理(消息转发)
- [iOS]使用NSProxy实现消息转发机制,模拟多重继承
- [iOS]使用NSProxy实现消息转发机制,模拟多重继承
- [iOS]使用NSProxy实现消息转发机制,模拟多重继承
- 使用NSProxy实现消息转发机制,模拟多重继承
- NSProxy与消息转发机制
- NSProxy实现代理方法
- NSProxy实现代理模式[转载]
- 使用NSProxy实现代理模式
- iOS开发--利用NSProxy实现消息转发-模块化的网络接口层设计
- 利用NSProxy实现消息转发-模块化的网络接口层设计
- [iOS]使用NSProxy实现代理模式
- 利用OC的消息转发机制实现多重代理
- golang 实现tcp转发代理
- NSProxy
- NSProxy
- NSProxy中methodSignatureForSelector、forwardInvocation两个消息方法
- Proxifier+SecureCRT 实现代理+动态端口转发
- 3*3 三行三列的圈叉棋
- 关于数据库的输入中文问题
- 数独求解
- struts1(6)-----表单防重复提交
- 《算法概论》思维导图
- NSProxy实现代理(消息转发)
- (15)删除文件
- 用latex模板撰写论文算法步骤图排版的问题
- Chukwa_Processes_and_Data_Flow
- checkio (water jars)
- sqlite3 配置交叉编译环境
- 如何让int型数据溢出
- 视图控制器更换几种方法
- Qt教程—信号与槽