获取协议中方法块的NSMethodSignature

时间:2019-02-19 21:43:42

标签: c objective-c objective-c-blocks swift-protocols

我正在尝试在Protocol方法中获取块的签名。

这是一个示例协议:

@protocol ProtocolSample <NSObject>
- (void) doSomething: (void (^) (NSString *))a_block;
@end

我可以使用以下方法获得doSomething的签名:

Protocol *protocol_sample = @protocol(ProtocolSample);

unsigned int outCount;
struct objc_method_description *method_description_list = protocol_copyMethodDescriptionList(protocol_sample, YES, YES, &outCount);

struct objc_method_description method_description = method_description_list[0];

NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:method_description.types];

我得到的签名是:v@:@?

我的目标是获得a_block的签名。我尝试了许多方法,包括:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

void *block;
[invocation getArgument:&block atIndex:2];

但是block始终是NULL

如何获得a_block的签名?

2 个答案:

答案 0 :(得分:1)

最后找到答案:const char *_protocol_getMethodTypeEncoding(Protocol *, SEL, BOOL isRequiredMethod, BOOL isInstanceMethod);

该方法将为您提供任何选择器的完整签名!

答案 1 :(得分:0)

还有

extern const char* _Block_signature(id block);

,您可以将其用于任何任意块对象。