C 获取协议中方法块的NSMethodSignature
我试图在协议方法中获取块的签名 下面是一个示例协议:C 获取协议中方法块的NSMethodSignature,c,objective-c,objective-c-blocks,swift-protocols,C,Objective C,Objective C Blocks,Swift Protocols,我试图在协议方法中获取块的签名 下面是一个示例协议: @protocol ProtocolSample <NSObject> - (void) doSomething: (void (^) (NSString *))a_block; @end 我得到的签名是:v@? 我的目标是获得a_块的签名。我尝试了许多方法,包括以下方法: Protocol *protocol_sample = @protocol(ProtocolSample); unsigned int outCount;
@protocol ProtocolSample <NSObject>
- (void) doSomething: (void (^) (NSString *))a_block;
@end
我得到的签名是:v@?
我的目标是获得a_块的签名。我尝试了许多方法,包括以下方法:
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];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
void *block;
[invocation getArgument:&block atIndex:2];
但是block
总是NULL
如何获得a_块的签名?最终找到了答案:const char*\u protocol\u getMethodTypeEncoding(protocol*,SEL,BOOL isRequiredMethod,BOOL isInstanceMethod)代码>
该方法将获得任何选择器的完整签名 还有
extern const char* _Block_signature(id block);
可用于任何任意块对象 块是一个对象,因此@
是正确的。看看我对类似问题的回答:不幸的是,它不起作用。我尝试了WSSBlockInvocation*block_invocation=[wssblockinvocationwithsignature:[wssblocksignaturesignatureforblock:(u桥id)(block)]代码>其中块
来自上面的问题文本。它提供了一个EXC\u BAD\u访问
,因为块
为空。是的,您需要一个块的实际实例来使用签名块:
@JoshCaswell我怎么做?我已经在这个问题上纠缠了好几天了:/你能解释一下你为什么要这么做吗?这可能会有帮助;可能还有另一种方法。我试着使用\u Block\u签名
,但不起作用。我必须导入一些框架才能找到它吗?我试着用谷歌搜索这个函数,但什么也没找到,苹果的文档也没找到。