【问题标题】:Get NSMethodSignature of a method block in a Protocol获取协议中方法块的 NSMethodSignature
【发布时间】:2019-02-19 21:43:41
【问题描述】:

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

这是一个示例协议:

@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的签名?

【问题讨论】:

  • 块是一个对象,所以@是正确的。看看我对类似问题的回答:stackoverflow.com/a/36162832/603977stackoverflow.com/a/17892240/603977
  • @JoshCaswell 不幸的是,它不起作用。我试过WSSBlockInvocation * block_invocation = [WSSBlockInvocation invocationWithSignature:[WSSBlockSignature signatureForBlock:(__bridge id)(block)]]; 其中block 来自上面的问题文本。它给出了一个EXC_BAD_ACCESS,因为block 是NULL。
  • 是的,您需要一个实际的 Block 实例才能使用 signatureForBlock:
  • @JoshCaswell 我该怎么做?我已经被这个问题困扰了好几天了:/
  • 您能解释一下为什么您要这样做吗?它可能会有所帮助;可能还有其他方法。

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


【解决方案1】:

终于找到答案了:const char *_protocol_getMethodTypeEncoding(Protocol *, SEL, BOOL isRequiredMethod, BOOL isInstanceMethod);

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

【讨论】:

    【解决方案2】:

    还有

    extern const char* _Block_signature(id block);
    

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

    【讨论】:

    • 我尝试使用_Block_signature,但它不起作用。我是否必须导入一些框架才能找到它?我试着用谷歌搜索这个功能,但我什么也没找到,Apple 的文档什么也没找到。
    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多