Objective-C:在带有参数的块上是否有-invoke?

DrJ*_*000 11 objective-c objective-c-blocks

您可能知道,块采取-invoke:

void(^foo)() = ^{
    NSLog(@"Do stuff");
};

[foo invoke];  // Logs 'Do stuff'
Run Code Online (Sandbox Code Playgroud)

我想做以下事情:

void(^bar)(int) = ^(int k) {
     NSLog(@"%d", k);
};

[bar invokeWithParameters:7];   // Want it to log '7', but no such instance method
Run Code Online (Sandbox Code Playgroud)

普通的自由论点-invoke可以使用bar,但它打印出一个无意义的值.

我找不到这种可以发送到块的直接消息,也无法找到描述块如何采用的原始文档-invoke.是否有块接受的消息列表?

(是的,我尝试使用class_copyMethodList从运行时提取方法列表;似乎没有.)

编辑:是的,我也知道以通常的方式调用块(bar(7);).我真正追求的是一个方法的选择器,我可以提供给不带块的库代码(本身).

Cal*_*leb 11

您可以像函数一样调用它:

bar(7);
Run Code Online (Sandbox Code Playgroud)

文档中甚至有一个使用完全相同签名的示例.请参阅声明和使用块.

关于块行为的最佳参考是块语言规范(RTF)文档.这提到了支持(复制,保留等)的某些方法,但没有提及-invoke方法.

  • Apple工程师[确认](https://devforums.apple.com/thread/123602?tstart=0)这是一种私有方法. (3认同)

bbu*_*bum 5

块的非常定义是块可以根据调用参数/ ABI接收的"消息"的总和.

这有几个原因:

首先,块不是函数,块指针不是函数指针.它们不能互换使用.

其次,将C ABI就是这样,你必须有功能的声明开始的时候,如果参数被正确编码被编译调用站点调用.

另一种方法是使用类似NSInvocation的东西,它允许单独编码参数,但即便如此,仍然需要每个单独参数的完整C ABI知识.

最后,如果您可以编译一个具有所有参数的调用站点,无论是Objective-C方法还是函数调用,为了使编译器满意所需的保真度,您可以将该调用站点转换为对块的调用.

即除非你澄清一下你的问题,否则由于C ABI的变幻莫测,你所要求的要么已经得到支持,要么几乎不可能.