【发布时间】: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/603977 和 stackoverflow.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