gpt4 book ai didi

ios - forwardIncation 不转发调用

转载 作者:行者123 更新时间:2023-11-29 03:50:03 27 4
gpt4 key购买 nike

我目前正在尝试使用forwardInitation,但遇到了一些问题。我想将有限方法集的 ClassA 调用转发到作为属性存储在我的 ClassA 中的另一个实例(ClassB),但是我还希望在 ClassA 中有一个后备方法,如果 ClassB 中未实现该方法,该方法将被执行。

不幸的是,我发现无论在 ClassB 上实现什么方法,ClassA 方法总是会被调用!

我的实现方式如下所示。谁能就我哪里出错提出任何建议?

static NSSet *forwardMessages;

@implementation ClassA

@synthesize classBInstance;

- (id) initWithDelegate:(id)delegate {
self = [super init];
classBInstance = delegate;
return self;
}

+ (void) initialize {
if (self == [ClassA class]) {
forwardMessages = [[NSSet alloc] initWithObjects:
@"doSomething",
@"doSomethingElse",
@"anotherThing",
@"yetMoreThings",
nil];

- (BOOL) respondsToSelector:(SEL)aSelector {
return [super respondsToSelector:aSelector] || [self isHandledByDelegate:aSelector];
}

- (BOOL) isHandledByDelegate:(SEL)aSelector {
return [forwardMessages containsObject:NSStringFromSelector(aSelector)] &&
[classBInstance respondsToSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
BOOL forwardThis = [self isHandledByDelegate: [anInvocation selector]];

if (forwardThis) {
[anInvocation invokeWithTarget:classBInstance];
} else {
[super forwardInvocation:anInvocation];
}
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
Class handlingClass = [self isHandledByDelegate:aSelector]? [classBInstance class]:[self class];
return [handlingClass instanceMethodSignatureForSelector:aSelector];
}

- (void) doSomething {
// this should be forwarded to classBInstance but is always called!
}

最佳答案

仅当所调用的类中不存在具有该签名的方法时,

-forwardInitation 才会由方法分派(dispatch)调用。如果您只是尝试调用委托(delegate)上的方法(如果委托(delegate)有这些方法),但您想在类中使用默认实现,否则,您不需要使用 -forwardInvocau,只需使用覆盖委托(delegate)模式。

- (void)doSomething {
if ([delegate respondsToSelector: @selector(doSomething)]) {
[delegate doSomething];
return;
}
// ... default behavior
}

如果你真的想使用一个复杂的形式,其中有一个要重写的方法列表等,你可能最终会使用 NSProxy 的子类来前端它并确定哪个类调用,但这似乎过于复杂,除非您无权访问您尝试填充的类。

关于ios - forwardIncation 不转发调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com