forwardInvocation :возвращаемое значение теряется

Я хочу использовать пересылку сообщения -в моем классе SZNUnmanagedReference. Он обладает этими свойствами:

@property (nonatomic, strong) NSSet *authors;
@property (nonatomic, strong) SZNReferenceDescriptor *referenceDescriptor;

По сути, когда экземпляр UnmanagedReference получает сообщение authorsString, он должен перенаправить его на referenceDescriptor, у которого есть метод с именем - (NSString *)authorsStringWithSet:(NSSet *)authors.

Итак, я написал это вSZNUnmanagedReference.m:

- (void)forwardInvocation:(NSInvocation *)anInvocation {

    SEL aSelector = anInvocation.selector;

    if ([NSStringFromSelector(aSelector) isEqualToString:NSStringFromSelector(@selector(authorsString))]) {
        NSMethodSignature *signature = [self.referenceDescriptor methodSignatureForSelector:@selector(authorsStringWithSet:)];
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
        NSSet *authors = [NSSet setWithSet:self.authors];
        [invocation setSelector:@selector(authorsStringWithSet:)];
        [invocation setArgument:&authors atIndex:2];
        [invocation setTarget:self.referenceDescriptor];

        [invocation invoke];
    } else {
        [self doesNotRecognizeSelector:aSelector];
    }
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    if ([super respondsToSelector:aSelector]) {
        return YES;
    } else if ([NSStringFromSelector(aSelector) isEqualToString:NSStringFromSelector(@selector(authorsString))] && [self.referenceDescriptor respondsToSelector:@selector(authorsStringWithSet:)]) {
        return YES;
    } else {
        return NO;
    }
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
    if (!signature) {  
        signature = [self.referenceDescriptor methodSignatureForSelector:@selector(authorsStringWithSet:)];
    }
    return signature;
}

Вроде все работает, код в классе SZNReferenceDescriptorвыполняется. Однако я не знаю, как вернуть authorsString. Если я правильно понял документацию, я думаю, что referenceDescriptorдолжен отправить результат обратно исходному отправителю сообщения. Но, похоже, это не работает. В моем тестовом классе [unmanagedReference authorsString]возвращает nil.

5
задан Camille Kander 12 July 2012 в 17:50
поделиться