gpt4 book ai didi

ios - 协议(protocol)的 NSMethodSignature

转载 作者:可可西里 更新时间:2023-11-01 05:45:11 25 4
gpt4 key购买 nike

我正在使用此方法将方法分派(dispatch)给委托(delegate),不幸的是,我发现大多数时候 NSMethodSignature 为 nil,这是因为选择器来自协议(protocol)。我想知道哪种方法是正确的:

  1. 询问方法是否来自协议(protocol)
  2. 获取协议(protocol)方法的签名

[编辑]
根据 newacct 用户的观察,我的问题是不正确的,签名为 nil 是正常的,但不是因为它是一个协议(protocol),而是因为我针对错误的对象询问方法签名。 Self 在这种情况下它没有实现我想要分派(dispatch)的方法,它是使用和实现它们的委托(delegate)。

代码如下:

- (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 的建议,代码变得非常复杂..希望尽快破解。

最佳答案

只是做:

if ([delegate respondsToSelector:@selector(someMethod:thatDoesSomething:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[delegate someMethod:foo thatDoesSomething:bar];
}
}

对运行时进行神奇处理的诱惑很强烈,但这只会导致代码过于复杂,难以理解,速度变慢,而且并没有真正节省那么多代码行。重构也更难。

这显然不考虑返回值。但是,为此,您真的想要避免任何类型的阻塞调用。告诉主线程去做某事,然后让它在完成后安排一个 block 在适当的队列上执行。这将降低死锁的风险并使您的整体应用程序设计更加简单。

请注意,当从主线程调用时,上面的代码将导致 block 在下一次通过主事件循环时执行。这可能正是您想要的,因为它与并发情况的行为一致。

关于ios - 协议(protocol)的 NSMethodSignature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17011197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com