The NSProxy 类参考 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSProxy_Class/Reference/Reference.html说:
通常,到代理的消息被转发到真实对象或导致代理加载(或将其自身转换成)真实对象。
“变形为实物”到底是如何进行的呢?
为了让事情更具体一点,假设类Foo
有一个方法newFooWithString:
它接受一个字符串并返回一个新实例Foo
。是否可以设置一个NSProxy
坐在周围,如果一个pleaseBecomeAFooUsingString: @"bar"
消息被接收,将其自身转换为[Foo newFooWithString: @"bar"]
,占用相同的内存,而不干扰可能存在的其他对其自身的引用?
如果您在整个代码中都有一个指向同一个 NSProxy 实例的指针,并且将“转换”它,那么它将在整个代码中发生变化。无法区分对象方法的调用者,因此您将无法自动替换代码中转发方法调用的目标。常见的可转换代理将如下所示:
MyTrickyProxy.h
#import <Foundation/Foundation.h>
@interface MyTrickyProxy : NSProxy {
NSObject *object;
}
- (id)transformToObject:(NSObject *)anObject;
@end
MyTrickyProxy.m
#import "MyTrickyProxy.h"
@implementation MyTrickyProxy
- (void)dealloc
{
[object release];
object = nil;
[super dealloc];
}
- (NSString *)description
{
return [object description];
}
//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
所以你要求的是某种代码魔法,但 NSProxy 是一个简单的消息转发器,根本没有任何魔法,所以你的目标无法以你所描述的方式实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)