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
。