Я хочу использовать пересылку сообщения -в моем классе 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
.