[iOS]使用NSProxy实现代理模式
2012-05-09 09:29
615 查看
// 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:来避免,如果有更好的方法,请告知。
#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 使用MVVM模式实现Cell的点击响应
- iOS设计模式-Block实现代理的逻辑
- iOS代理模式实现原理
- ios-day07-01(使用xib自定义cell、UITableView的footerView“点击加载更多”、headerView为UIScrollView、代理模式的应用)
- iOS开发——使用代理(Delegate)实现跨界面执行跳转请求
- NSProxy实现代理模式[转载]
- [iOS]使用NSProxy实现消息转发机制,模拟多重继承
- iOS 使用MVVM模式实现Cell的点击响应
- iOS 使用cell的删除功能,实现tableview的代理
- iOS开发之UitableViewCell中UISwitch的使用,代理实现
- 设计模式-代理模式与适配器模式实现代码重用以及策略模式的使用
- iOS 设计模式-Block实现代理的逻辑
- iOS协议与代理设计模式介绍与使用
- 【iOS开发-54】案例学习:通过UIScrollView的缩放图片功能练习代理模式的具体实现
- iOS网络篇---使用NSConnection 实现post和get发送和接收(同步和异步模式)
- ios开发单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式
- 实例讲解如何在iOS应用开发中使用设计模式中的代理模式
- iOS 下实现代理设计模式