Ответ 1
Если у вас есть указатель на один и тот же экземпляр 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 - это простой переадресатор сообщений, нет никакой магии, поэтому ваша цель не достижима так, как вы описали.