Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取协议中方法块的NSMethodSignature_C_Objective C_Objective C Blocks_Swift Protocols - Fatal编程技术网

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签名
,但不起作用。我必须导入一些框架才能找到它吗?我试着用谷歌搜索这个函数,但什么也没找到,苹果的文档也没找到。