我正在使用这种方法将方法分派给委托,不幸的是我发现大多数时候 NSMethodSignature 是 nil,这是由于选择器来自协议的事实。我想知道哪种方法是正确的:
- Aks 方法是否来自协议
- 获取协议方法的签名
[编辑]
根据 newacct 用户的观察,我的问题不正确,签名为零是正常的,但不是因为是协议,而是因为我要求方法签名针对错误的对象。Self
在这种情况下,它没有实现我想要调度的方法,它是使用和实现它们的委托。
这是代码:
- (BOOL) dispatchToDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err {
NSMethodSignature *methodSig = [[self class] instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSig];
[invocation setTarget:self.delegate];
BOOL result = NO;
if([self.delegate respondsToSelector: selector]) {
if(arg != NULL) {
[invocation setArgument:&arg atIndex:2];
[invocation setArgument:&err atIndex:3];
}else {
[invocation setArgument:&err atIndex:2];
}
if ([NSThread isMainThread]) {
[invocation invoke];
}
else{
[invocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES];
}
[invocation getReturnValue:&result];
}
else
NSLog(@"Missed Method");
return result;
}
[已更新]
我修改了 Apple 邮件列表中的一个方法
- (NSMethodSignature *)methodSignatureForSelector:(SEL)inSelector
{
NSMethodSignature *theMethodSignature = [super methodSignatureForSelector:inSelector];
if (theMethodSignature == NULL)
{
struct objc_method_description theDescription = protocol_getMethodDescription(@protocol(GameCenterManagerDelegate),inSelector, NO, YES);
theMethodSignature = [NSMethodSignature signatureWithObjCTypes:theDescription.types];
}
return(theMethodSignature);
}
它可以工作,但我会遵循 bbum 的建议,代码变得非常复杂......喜欢很快就会中断。