Wil*_*sch 11 cocoa cocoa-touch objective-c nsproxy
该NSProxy类参考这样说:
通常,将代理的消息转发到真实对象或使代理加载(或转换为自身)真实对象.
"将自身转化为真实对象"究竟会如何运作?
为了使事情更具体一些,假设class 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以你要求的是某种代码魔术,但NSProxy是一个简单的消息转发器,根本没有任何魔法,所以你的目标无法按照你所描述的方式实现.
| 归档时间: |
|
| 查看次数: |
2929 次 |
| 最近记录: |