ios - forwardIncation 不转发调用

标签 ios objective-c

我目前正在尝试使用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/

相关文章:

ios - 如何将 UITextfield 上的左 View 位置设置为靠近占位符文本

ios - 尝试设置 UILabel 的文本时,结果始终为 'Optional("0. 0")'

iphone - 如何在我的应用程序本地文档目录中将 NSString 另存为 .txt 文件?

iphone - 通过应用程序调用电话

ios - 使用 2 个排序描述符对数组进行排序

ios - 自 iOS 9 以来如何为状态栏样式更改设置动画

iOs 8 在同一设备上显示与 iOs7 不同的相同应用程序

ios - 我应该什么时候设计 UINavigationBar?

objective-c - 不同的 C++ include 语句在 Objective-C header 中抛出错误

ios - 按日期用字典对数组进行排序